本文目录导读:

我来详细介绍使用Pandas进行多键数据分组的方法:
基本单键分组
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'部门': ['技术', '销售', '技术', '销售', '技术', '销售'],
'城市': ['北京', '上海', '北京', '上海', '上海', '北京'],
'销售额': [100, 200, 150, 300, 120, 250]
})
# 单键分组
print(df.groupby('部门')['销售额'].sum())
多键分组(核心内容)
# 方法1:使用列表传入多个键
grouped = df.groupby(['部门', '城市'])['销售额'].sum()
print("多键分组-求和:")
print(grouped)
# 方法2:使用多个聚合函数
grouped_multi = df.groupby(['部门', '城市']).agg({
'销售额': ['sum', 'mean', 'count', 'max', 'min']
})
print("\n多键分组-多重聚合:")
print(grouped_multi)
多键分组的实际案例
# 创建更复杂的数据集
data = {
'日期': pd.date_range('2024-01-01', periods=12, freq='M'),
'地区': ['华东', '华北', '华南', '华东', '华北', '华南'] * 2,
'产品': ['A', 'B', 'A', 'B', 'A', 'B'] * 2,
'销量': np.random.randint(100, 500, 12),
'收入': np.random.randint(10000, 50000, 12)
}
df_sales = pd.DataFrame(data)
print("原始数据:")
print(df_sales)
# 案例1:按地区和产品分组统计
print("\n=== 案例1:按地区和产品分组统计 ===")
grouped1 = df_sales.groupby(['地区', '产品']).agg({
'销量': 'sum',
'收入': 'sum'
})
print(grouped1)
# 案例2:多层索引的分组统计
print("\n=== 案例2:多层索引分组求和 ===")
grouped2 = df_sales.groupby(['地区', '产品'])['收入'].sum()
print(grouped2)
# 案例3:多层次索引重置
print("\n=== 案例3:重置索引 ===")
grouped3 = df_sales.groupby(['地区', '产品'])['收入'].sum().reset_index()
print(grouped3)
高级多键分组操作
# 1. 使用命名聚合(Pandas 0.25+)
print("\n=== 命名聚合 ===")
named_agg = df_sales.groupby(['地区', '产品']).agg(
总销量=('销量', 'sum'),
平均收入=('收入', 'mean'),
最大收入=('收入', 'max'),
记录数=('销量', 'count')
).round(2)
print(named_agg)
# 2. 分组后的条件过滤
print("\n=== 筛选销量大于600的分组 ===")
filtered = df_sales.groupby(['地区', '产品'])['销量'].sum()
high_performers = filtered[filtered > 600]
print(high_performers)
# 3. 分组后转换(Transform)
print("\n=== 分组内标准化(Transform) ===")
df_sales['销量标准化'] = df_sales.groupby(['地区', '产品'])['销量'].transform(
lambda x: (x - x.mean()) / x.std()
)
print(df_sales[['地区', '产品', '销量', '销量标准化']])
# 4. 多个分组操作组合
print("\n=== 复杂聚合 ===")
complex_agg = df_sales.groupby(['地区', '产品']).agg(
总销量=('销量', 'sum'),
平均销量=('销量', 'mean'),
销量标准差=('销量', 'std'),
总收入=('收入', 'sum'),
平均收入=('收入', 'mean'),
收入中位数=('收入', 'median')
).round(2)
print(complex_agg)
实用案例:销售数据分析
# 创建销售数据
sales_data = {
'日期': pd.date_range('2024-01-01', periods=100, freq='D'),
'城市': np.random.choice(['北京', '上海', '广州', '深圳'], 100),
'产品类别': np.random.choice(['电子', '服装', '食品'], 100),
'销售额': np.random.randint(100, 1000, 100),
'成本': np.random.randint(50, 500, 100)
}
df_sales = pd.DataFrame(sales_data)
# 多维度分析
print("=== 多维度销售分析 ===")
# 1. 按城市和产品类别分析销售额
analysis1 = df_sales.groupby(['城市', '产品类别']).agg({
'销售额': ['sum', 'mean', 'count'],
'成本': 'sum'
}).round(2)
print("\n1. 城市-产品类别销售分析:")
print(analysis1)
# 2. 计算利润
df_sales['利润'] = df_sales['销售额'] - df_sales['成本']
# 3. 按城市和类别统计利润
analysis2 = df_sales.groupby(['城市', '产品类别']).agg({
'利润': ['sum', 'mean'],
'销售额': 'sum'
}).round(2)
print("\n2. 利润分析:")
print(analysis2)
# 4. 找出每组利润最高的记录
def top_n(group, n=1):
return group.nlargest(n, '利润')
top_performers = df_sales.groupby(['城市', '产品类别']).apply(
top_n, n=1
).reset_index(drop=True)
print("\n3. 每组利润最高的记录:")
print(top_performers[['城市', '产品类别', '销售额', '利润']])
实用技巧
# 1. 分组后排序
print("\n=== 分组后排序 ===")
df_sales['销售额排名'] = df_sales.groupby(['城市', '产品类别'])['销售额'].rank(ascending=False)
print(df_sales.head())
# 2. 分位数分析
print("\n=== 分位数分析 ===")
quantile_analysis = df_sales.groupby(['城市', '产品类别'])['销售额'].quantile([0.25, 0.5, 0.75])
print(quantile_analysis)
# 3. 分组填充缺失值
df_fill = df_sales.copy()
df_fill.loc[df_fill.sample(10).index, '销售额'] = np.nan
df_fill['销售额'] = df_fill.groupby(['城市', '产品类别'])['销售额'].transform(
lambda x: x.fillna(x.mean())
)
print("\n4. 分组填充缺失值(使用均值):")
print(df_fill.head())
性能优化建议
# 使用分类数据提高性能
df_optimized = df_sales.copy()
df_optimized['城市'] = df_optimized['城市'].astype('category')
df_optimized['产品类别'] = df_optimized['产品类别'].astype('category')
# 性能对比
import time
start = time.time()
result1 = df_sales.groupby(['城市', '产品类别'])['销售额'].sum()
end = time.time()
print(f"普通分组耗时: {end - start:.4f}秒")
start = time.time()
result2 = df_optimized.groupby(['城市', '产品类别'])['销售额'].sum()
end = time.time()
print(f"分类数据分组耗时: {end - start:.4f}秒")
这些示例涵盖了多键分组的主要用法,包括基本分组、聚合操作、变换操作和实际应用场景,记住多键分组是数据分析中非常强大的工具,可以快速提取多维度数据洞察。