本文目录导读:

我来详细介绍如何使用Pandas进行数据分组和重分层(重新分组)的案例。
基础数据准备
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'city': ['北京', '北京', '上海', '上海', '广州', '广州', '深圳', '深圳'],
'category': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
'sales': [100, 150, 200, 180, 120, 160, 190, 210],
'profit': [20, 30, 40, 35, 25, 32, 38, 42]
})
print("原始数据:")
print(df)
基础分组操作
# 按单个列分组
grouped_single = df.groupby('city')['sales'].sum()
print("按城市分组统计销售额合计:")
print(grouped_single)
# 按多个列分组
grouped_multi = df.groupby(['city', 'category'])['sales'].sum()
print("\n按城市和类别分组:")
print(grouped_multi)
# 多维度聚合
agg_result = df.groupby('city').agg({
'sales': ['sum', 'mean', 'max'],
'profit': ['sum', 'mean']
})
print("\n多维度聚合结果:")
print(agg_result)
数据重分层(重新分组)
# 创建分层数据
multi_index_df = pd.DataFrame({
'region': ['华北', '华北', '华东', '华东', '华南', '华南'],
'city': ['北京', '天津', '上海', '杭州', '广州', '深圳'],
'sales_2023': [1000, 800, 1200, 900, 1100, 950],
'sales_2024': [1100, 850, 1300, 950, 1150, 1000]
}).set_index(['region', 'city'])
print("原始分层数据:")
print(multi_index_df)
# 方法1: 使用groupby重新分组
re_grouped = multi_index_df.groupby(level='region').sum()
print("\n按地区重新分组求和:")
print(re_grouped)
# 方法2: 使用stack/unstack进行重分层
unstacked = multi_index_df.unstack(level='city')
print("\n将城市转换为列:")
print(unstacked)
# 方法3: 使用pivot_table创建新分组
pivot_result = pd.pivot_table(
multi_index_df.reset_index(),
values='sales_2024',
index='region',
columns='city',
aggfunc='sum'
)
print("\n使用数据透视表重新分组:")
print(pivot_result)
高级重分层技巧
# 创建更复杂的数据
complex_df = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=12, freq='M'),
'region': ['华北', '华东', '华南'] * 4,
'product': ['A', 'B', 'C'] * 4,
'sales': np.random.randint(100, 500, 12),
'quantity': np.random.randint(10, 50, 12)
})
print("复杂数据示例:")
print(complex_df.head(6))
# 1. 按时间周期重分层
complex_df['quarter'] = complex_df['date'].dt.quarter
complex_df['year_month'] = complex_df['date'].dt.strftime('%Y-%m')
quarterly_group = complex_df.groupby(['region', 'quarter']).agg({
'sales': 'sum',
'quantity': 'sum'
})
print("\n按季度和地区重分层:")
print(quarterly_group)
# 2. 自定义分组函数重分层
def sales_category(x):
if x > 300:
return '高销售额'
elif x > 200:
return '中销售额'
else:
return '低销售额'
complex_df['sales_level'] = complex_df['sales'].apply(sales_category)
level_group = complex_df.groupby(['region', 'sales_level']).size()
print("\n按销售额级别重分层:")
print(level_group)
# 3. 使用cut进行数值分段
complex_df['sales_bins'] = pd.cut(complex_df['sales'],
bins=[0, 200, 300, 400, 500],
labels=['低', '中低', '中高', '高'])
bins_group = complex_df.groupby(['region', 'sales_bins'])['quantity'].sum()
print("\n使用cut分段后重分层:")
print(bins_group)
实际应用案例:销售数据分析
# 生成模拟销售数据
np.random.seed(42)
sales_data = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=100, freq='D'),
'store': np.random.choice(['Store_A', 'Store_B', 'Store_C'], 100),
'category': np.random.choice(['Electronics', 'Clothing', 'Food'], 100),
'sales': np.random.randint(50, 500, 100),
'customers': np.random.randint(5, 50, 100)
})
print("销售数据前5行:")
print(sales_data.head())
# 应用:按门店和类别进行多层级分析
result = sales_data.groupby(['store', 'category']).agg({
'sales': ['sum', 'mean', 'count'],
'customers': 'sum'
}).round(2)
print("\n门店-类别层级分析:")
print(result)
# 应用:时间序列重分层
sales_data['week'] = sales_data['date'].dt.isocalendar().week
sales_data['day_of_week'] = sales_data['date'].dt.day_name()
weekly_analysis = sales_data.groupby(['store', 'week']).agg({
'sales': 'sum',
'customers': 'mean'
})
print("\n周度门店分析(前10行):")
print(weekly_analysis.head(10))
实用技巧汇总
# 1. 重置索引并保留分组层级
grouped = df.groupby(['city', 'category']).sum()
reset_grouped = grouped.reset_index()
print("重置索引后:")
print(reset_grouped)
# 2. 使用多个聚合函数
agg_functions = {
'sales': ['sum', 'mean', 'std'],
'profit': ['sum', 'mean', 'max']
}
multi_agg = df.groupby('city').agg(agg_functions)
print("\n多聚合函数结果:")
print(multi_agg)
# 3. 自定义聚合函数
def range_func(x):
return x.max() - x.min()
custom_agg = df.groupby('city').agg({
'sales': ['sum', range_func],
'profit': ['mean', range_func]
})
print("\n自定义聚合函数:")
print(custom_agg)
# 4. 分层数据的合并
hierarchical1 = df.set_index(['city', 'category'])
hierarchical2 = pd.DataFrame({
('北京', 'A'): {'target': 200},
('北京', 'B'): {'target': 250},
('上海', 'A'): {'target': 300}
})
print("\n分层数据结构示例:")
print(hierarchical1)
- groupby:最基础的分组工具
- pivot_table:适合创建新的分层结构
- stack/unstack:在行列之间转换分层
- cut/qcut:数值分段重分层
- 自定义函数:灵活的重分层逻辑
这些技巧在实际数据分析中非常实用,可以根据具体需求灵活组合使用。