本文目录导读:

我来详细介绍如何使用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:数值分段重分层
- 自定义函数:灵活的重分层逻辑
这些技巧在实际数据分析中非常实用,可以根据具体需求灵活组合使用。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播