Python案例如何用Pandas做数据索引分层

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据索引分层

  1. 创建分层索引
  2. 索引操作
  3. 实际业务案例
  4. 高级操作技巧
  5. 实用技巧总结

我来详细讲解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分层索引的主要操作,关键在于理解:

  • 分层索引适用于多维数据分析
  • 可以通过多种方式创建和操作
  • 支持高效的数据聚合和筛选

建议根据实际业务需求选择合适的操作方式。

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