本文目录导读:

我来详细讲解Python Pandas如何实现数据索引分层,包含多个实用案例。
创建分层索引
1 创建Series分层索引
import pandas as pd
import numpy as np
# 方法1:使用MultiIndex
index = pd.MultiIndex.from_tuples([
('北京', '2024-01'), ('北京', '2024-02'),
('上海', '2024-01'), ('上海', '2024-02'),
('广州', '2024-01'), ('广州', '2024-02')
], names=['城市', '月份'])
data = pd.Series([100, 120, 90, 110, 80, 95], index=index)
print("分层索引Series:")
print(data)
print()
# 方法2:使用from_arrays
arrays = [
['A', 'A', 'A', 'B', 'B', 'B'],
[1, 2, 3, 1, 2, 3]
]
index2 = pd.MultiIndex.from_arrays(arrays, names=['类别', '序号'])
data2 = pd.Series(np.random.randn(6), index=index2)
print("使用from_arrays创建:")
print(data2)
2 创建DataFrame分层索引
# 创建多层索引DataFrame
arrays = [
['华北', '华北', '华北', '华东', '华东', '华南'],
['北京', '天津', '石家庄', '上海', '南京', '广州'],
['Q1', 'Q2', 'Q3', 'Q4', 'Q1', 'Q2']
]
index = pd.MultiIndex.from_arrays(arrays, names=['地区', '城市', '季度'])
df = pd.DataFrame({
'销售额': np.random.randint(100, 500, 6),
'利润': np.random.randint(10, 50, 6)
}, index=index)
print("多层索引DataFrame:")
print(df)
索引操作
1 访问和切片
# 准备数据
index = pd.MultiIndex.from_tuples([
('A', 1), ('A', 2), ('A', 3),
('B', 1), ('B', 2), ('B', 3),
('C', 1), ('C', 2), ('C', 3)
], names=['类别', '序号'])
df = pd.DataFrame({
'数值': np.random.randn(9),
'分类': ['x', 'y', 'z'] * 3
}, index=index)
print("原始数据:")
print(df)
print()
# 访问特定层
print("访问类别层:")
print(df.index.get_level_values('类别'))
print()
# 切片操作(使用xs)
print("使用xs选择类别A的数据:")
print(df.xs('A', level='类别'))
print()
# 使用loc进行切片
print("使用loc选择类别A的数据:")
print(df.loc['A'])
print()
# 多重切片
print("选择类别A中序号为2的数据:")
print(df.loc[('A', 2)])
2 索引的交换和重排
# 交换层级
print("交换层级顺序:")
swapped = df.swaplevel('类别', '序号')
print(swapped)
print()
# 排序索引
print("按索引排序:")
sorted_df = df.sort_index()
print(sorted_df)
print()
# 重新排序层级
print("重排序层级:")
reordered = df.reorder_levels(['序号', '类别'])
print(reordered)
实际业务案例
1 销售数据分析
# 创建销售数据
sales_data = {
('北京', '电子产品'): {'Q1': 100, 'Q2': 120, 'Q3': 110, 'Q4': 130},
('北京', '服装'): {'Q1': 80, 'Q2': 90, 'Q3': 85, 'Q4': 95},
('上海', '电子产品'): {'Q1': 90, 'Q2': 100, 'Q3': 95, 'Q4': 110},
('上海', '服装'): {'Q1': 70, 'Q2': 75, 'Q3': 80, 'Q4': 85},
}
# 转换为DataFrame
df_sales = pd.DataFrame(sales_data).T
df_sales.index.names = ['城市', '产品类别']
print("销售数据矩阵:")
print(df_sales)
print()
# 按城市汇总
city_summary = df_sales.groupby(level='城市').sum()
print("按城市汇总:")
print(city_summary)
print()
# 按产品类别汇总
product_summary = df_sales.groupby(level='产品类别').mean()
print("按产品类别平均:")
print(product_summary)
2 时间序列多级索引
# 创建时间序列数据
dates = pd.date_range('2024-01-01', periods=4, freq='M')
categories = ['A', 'B', 'C']
# 创建多级索引
multi_index = pd.MultiIndex.from_product(
[dates, categories],
names=['日期', '类别']
)
# 创建数据
data = np.random.randn(len(multi_index))
ts_data = pd.Series(data, index=multi_index)
print("时间序列多级索引:")
print(ts_data)
print()
# 按日期统计
daily_stats = ts_data.groupby(level='日期').agg(['mean', 'std'])
print("每日统计:")
print(daily_stats)
高级操作技巧
1 堆叠和取消堆叠
# 示例数据
data = {
('北京', 'Q1'): 100,
('北京', 'Q2'): 120,
('上海', 'Q1'): 90,
('上海', 'Q2'): 110
}
series = pd.Series(data)
series.index.names = ['城市', '季度']
print("原始数据:")
print(series)
print()
# unstack操作(将内层索引转为列)
unstacked = series.unstack()
print("unstack后:")
print(unstacked)
print()
# stack操作
stacked = unstacked.stack()
print("stack后:")
print(stacked)
2 条件筛选
# 创建复杂数据集
index = pd.MultiIndex.from_product([
['A', 'B', 'C'],
[1, 2, 3],
['x', 'y']
], names=['类别', '序号', '类型'])
df = pd.DataFrame({
'数值': np.random.randint(0, 100, 18),
'标记': ['甲', '乙'] * 9
}, index=index)
print("复杂数据集:")
print(df)
print()
# 条件筛选示例
print("数值大于50的数据:")
print(df[df['数值'] > 50])
print()
# 多条件筛选
print("类别为A且数值大于50:")
print(df.loc['A'][df.loc['A']['数值'] > 50])
实用技巧总结
# 1. 检查索引层级数
print(f"索引层级数: {df.index.nlevels}")
# 2. 获取层级名称
print(f"层级名称: {df.index.names}")
# 3. 删除层级
new_df = df.droplevel('类型')
print("删除类型层级后:")
print(new_df)
# 4. 添加层级
new_index = pd.MultiIndex.from_arrays([
df.index.get_level_values(0),
df.index.get_level_values(1),
['新增'] * len(df)
], names=list(df.index.names) + ['新层级'])
df_new = df.copy()
df_new.index = new_index
print("添加新层级:")
print(df_new)
这些案例涵盖了Pandas分层索引的主要操作,关键在于理解:
- 分层索引适用于多维数据分析
- 可以通过多种方式创建和操作
- 支持高效的数据聚合和筛选
建议根据实际业务需求选择合适的操作方式。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播