本文目录导读:

我来用具体案例说明Pandas数据分组降维的几种常用方法:
案例1:基础分组聚合(最常用)
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'部门': ['销售', '技术', '销售', '技术', '销售', '技术', '销售', '技术'],
'性别': ['男', '男', '女', '女', '男', '男', '女', '女'],
'年龄': [25, 28, 30, 35, 22, 27, 33, 29],
'薪资': [8000, 12000, 9000, 15000, 7500, 11000, 8500, 13000],
'绩效': [85, 90, 88, 92, 78, 85, 90, 88]
})
# 1. 单维度分组聚合 - 按部门分组求平均
dept_stats = df.groupby('部门').agg({
'薪资': 'mean',
'年龄': 'mean',
'绩效': ['mean', 'max', 'min']
}).round(2)
print("各部门统计:")
print(dept_stats)
案例2:多维度分组降维
# 2. 多维度分组
multi_stats = df.groupby(['部门', '性别']).agg({
'薪资': ['mean', 'count'],
'绩效': 'mean'
}).round(2)
print("\n多维分组统计:")
print(multi_stats)
# 3. 使用reset_index()降维
flat_stats = df.groupby(['部门', '性别']).agg(
avg_salary=('薪资', 'mean'),
count=('薪资', 'count'),
avg_performance=('绩效', 'mean')
).reset_index()
print("\n降维后的数据:")
print(flat_stats)
案例3:实际业务场景
# 创建销售数据
sales_data = pd.DataFrame({
'日期': pd.date_range('2024-01-01', periods=100, freq='D'),
'区域': np.random.choice(['华东', '华南', '华北', '西部'], 100),
'产品': np.random.choice(['A', 'B', 'C'], 100),
'销售额': np.random.randint(1000, 10000, 100),
'客户数': np.random.randint(10, 100, 100),
'利润率': np.random.uniform(0.1, 0.3, 100)
})
# 按月、区域、产品分组统计
sales_data['月份'] = sales_data['日期'].dt.month
sales_data['季度'] = sales_data['日期'].dt.quarter
# 高级分组降维
summary = sales_data.groupby(['区域', '产品', '季度']).agg({
'销售额': ['sum', 'mean', 'count'],
'客户数': 'sum',
'利润率': 'mean'
}).round(2)
# 重命名列
summary.columns = ['总销售额', '平均销售额', '交易次数', '总客户数', '平均利润率']
summary = summary.reset_index()
print("销售汇总数据:")
print(summary.head(10))
案例4:分组后的变换与透视
# 4. 使用pivot_table实现分组降维
pivot_df = pd.pivot_table(
sales_data,
values=['销售额', '客户数'],
index=['区域', '产品'],
columns=['季度'],
aggfunc={'销售额': 'sum', '客户数': 'sum'},
fill_value=0
)
print("\n透视表结果:")
print(pivot_df)
# 5. 使用transform保持原维度
sales_data['区域平均销售'] = sales_data.groupby('区域')['销售额'].transform('mean')
sales_data['区域销售排名'] = sales_data.groupby('区域')['销售额'].transform('rank', ascending=False)
print("\n保留原维度的统计:")
print(sales_data[['区域', '销售额', '区域平均销售', '区域销售排名']].head(10))
案例5:复杂分组降维操作
# 创建更复杂的数据
complex_data = pd.DataFrame({
'用户': ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D'],
'月份': [1, 2, 1, 2, 1, 2, 1, 2],
'购买金额': [100, 200, 150, 180, 300, 250, 400, 350],
'购买次数': [2, 3, 2, 2, 3, 4, 5, 6]
})
# 高级聚合函数
def range_func(x):
return x.max() - x.min()
def growth_rate(x):
return (x.iloc[-1] - x.iloc[0]) / x.iloc[0] if len(x) > 1 else 0
user_behavior = complex_data.groupby('用户').agg({
'购买金额': ['sum', 'mean', range_func, growth_rate],
'购买次数': ['sum', 'mean', 'max']
}).round(2)
# 扁平化列索引
user_behavior.columns = ['_'.join(col).strip() for col in user_behavior.columns.values]
user_behavior = user_behavior.reset_index()
print("用户行为分析:")
print(user_behavior)
实用技巧
# 1. 使用named aggregation (推荐)
clean_result = sales_data.groupby(['区域', '产品']).agg(
总销售额=('销售额', 'sum'),
平均销售额=('销售额', 'mean'),
总客户数=('客户数', 'sum'),
平均利润率=('利润率', 'mean'),
交易次数=('销售额', 'count')
).round(2).reset_index()
print("\n清晰的分组结果:")
print(clean_result.head(10))
# 2. 分组后排序
top_regions = clean_result.sort_values('总销售额', ascending=False).head(5)
print("\n销售额Top5:")
print(top_regions)
# 3. 数据导出
# clean_result.to_excel('分组统计结果.xlsx', index=False)
核心要点:
groupby()是分组降维的核心函数agg()指定聚合方式,可以是多个函数reset_index()将分组索引转为普通列pivot_table()实现数据透视transform()保持原数据维度添加统计值
这些方法能帮你有效处理数据的分类汇总和降维分析。