Python案例如何用Pandas做数据索引级别

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据索引级别

  1. 创建多级索引数据
  2. 索引级别的基本操作
  3. 按索引级别选择数据
  4. 索引级别转换
  5. 索引级别聚合操作
  6. 索引级别合并与展开
  7. 高级索引操作
  8. 实践案例:销售数据分析
  9. 索引级别操作的实用技巧

我来详细讲解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中索引级别的主要操作,包括:

  • 创建和操作多级索引
  • 按不同级别选择和筛选数据
  • 索引级别的转换和重组
  • 按索引级别进行聚合分析
  • 高级索引操作技巧

掌握这些操作对于处理复杂的数据结构非常有用。

抱歉,评论功能暂时关闭!