本文目录导读:

我来详细介绍使用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}秒")
这些示例涵盖了多键分组的主要用法,包括基本分组、聚合操作、变换操作和实际应用场景,记住多键分组是数据分析中非常强大的工具,可以快速提取多维度数据洞察。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播