本文目录导读:

我来详细讲解Pandas中处理数据索引级别的各种方法。
创建多级索引数据
import pandas as pd
import numpy as np
# 创建多级索引DataFrame
arrays = [
['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'],
['X', 'Y', 'Z', 'X', 'Y', 'Z', 'X', 'Y']
]
index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
df = pd.DataFrame({
'value1': np.random.randn(8),
'value2': np.random.randn(8),
'value3': np.arange(8)
}, index=index)
print("原始数据:")
print(df)
print()
# 或者用另一种方式创建
df2 = pd.DataFrame({
'value': [1, 2, 3, 4, 5, 6]
}, index=pd.MultiIndex.from_tuples([
('A', 'X'), ('A', 'Y'), ('A', 'Z'),
('B', 'X'), ('B', 'Y'), ('B', 'Z')
], names=['group', 'subgroup']))
print("另一种创建方式:")
print(df2)
索引级别的基本操作
# 获取索引级别名称
print("索引级别名称:", df.index.names)
print()
# 获取特定级别的值
print("第一级别的值:")
print(df.index.get_level_values('first').unique())
print()
# 获取索引级别数
print("索引级别数:", df.index.nlevels)
print()
# 重新排序索引级别
df_reordered = df.reorder_levels(['second', 'first'])
print("重新排序索引级别后:")
print(df_reordered)
按索引级别选择数据
# 按第一级别选择
print("选择第一级别为'A'的数据:")
print(df.loc['A'])
print()
# 按多级别选择
print("选择'A', 'X'对应的数据:")
print(df.loc[('A', 'X')])
print()
# 使用xs选择特定级别
print("使用xs选择第二级别为'X'的所有数据:")
print(df.xs('X', level='second'))
print()
# 选择多个值
print("选择第一级别为'A'或'B'的数据:")
print(df.loc[['A', 'B']])
索引级别转换
# 重置索引(移除索引级别)
df_reset = df.reset_index()
print("重置索引后:")
print(df_reset)
print()
# 重置指定级别
df_reset_level = df.reset_index(level='second')
print("只重置第二级别:")
print(df_reset_level)
print()
# 设置索引
df_new_index = df.reset_index().set_index(['first', 'second'])
print("重新设置多级索引:")
print(df_new_index)
索引级别聚合操作
# 按索引级别分组聚合
print("按第一级别聚合(求和):")
print(df.groupby(level='first').sum())
print()
print("按第二级别聚合(求均值):")
print(df.groupby(level='second').mean())
print()
# 多级别聚合
print("按两个级别聚合:")
print(df.groupby(level=['first', 'second']).agg({
'value1': 'sum',
'value2': 'mean',
'value3': 'count'
}))
索引级别合并与展开
# 合并索引导出字符串
df['combined_index'] = df.index.map(lambda x: f"{x[0]}_{x[1]}")
print("合并索引:")
print(df)
print()
# 展开多级索引为列
df_unstack = df.unstack(level='second')
print("展开第二级别为列:")
print(df_unstack)
print()
# 堆叠
df_stacked = df_unstack.stack()
print("堆叠后:")
print(df_stacked)
高级索引操作
# 使用切片选择
print("第一级别'A'到'B'的数据:")
print(df.loc['A':'B'])
print()
# 使用IndexSlice
idx = pd.IndexSlice
print("选择第一级别'A',第二级别'X'和'Y'的数据:")
print(df.loc[idx['A', ['X', 'Y']], :])
print()
# 交换索引级别
df_swapped = df.swaplevel('first', 'second')
print("交换索引级别后:")
print(df_swapped)
print()
# 删除特定级别
df_dropped = df.droplevel('second')
print("删除第二级别:")
print(df_dropped)
实践案例:销售数据分析
# 创建销售数据
sales_data = pd.DataFrame({
'销售额': np.random.randint(100, 1000, 12),
'数量': np.random.randint(10, 100, 12),
'利润': np.random.randint(20, 200, 12)
}, index=pd.MultiIndex.from_product([
['华北', '华东', '华南', '西部'],
['Q1', 'Q2', 'Q3']
], names=['地区', '季度']))
print("销售数据:")
print(sales_data)
print()
# 各地区的销售分析
regional_analysis = sales_data.groupby(level='地区').agg({
'销售额': ['sum', 'mean', 'max'],
'利润': ['sum', 'mean']
})
print("各地区销售分析:")
print(regional_analysis)
print()
# 各季度分析
quarterly_analysis = sales_data.groupby(level='季度').agg({
'销售额': 'sum',
'数量': 'sum'
})
print("各季度分析:")
print(quarterly_analysis)
print()
# 各地区各季度趋势
trend_data = sales_data.unstack(level='地区')
print("各地区各季度趋势:")
print(trend_data)
索引级别操作的实用技巧
# 检查索引是否唯一
print("索引是否唯一:", df.index.is_unique)
print()
# 获取特定级别的唯一值
print("第一级别唯一值:", df.index.get_level_values(0).unique())
print("第二级别唯一值:", df.index.get_level_values(1).unique())
print()
# 按条件筛选
condition = df.index.get_level_values('first') == 'A'
print("第一级别为'A'的数据:")
print(df[condition])
print()
# 修改索引级别名称
df_renamed = df.rename_axis(index={'first': 'Group', 'second': 'SubGroup'})
print("修改索引名称后:")
print(df_renamed)
这些案例涵盖了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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播