本文目录导读:

我来为您详细介绍如何使用Pandas进行数据分组迁移(分组聚合和转换操作)。
基础分组聚合
准备示例数据
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'部门': ['技术部', '技术部', '市场部', '市场部', '销售部', '销售部'],
'姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
'工资': [15000, 12000, 10000, 11000, 8000, 9000],
'年龄': [28, 32, 25, 30, 35, 27]
})
print("原始数据:")
print(df)
分组聚合操作
统计各部門的平均工资和人数
# 分组统计
result = df.groupby('部门').agg({
'工资': ['mean', 'sum', 'count'],
'年龄': ['mean', 'min', 'max']
})
print("各部门统计信息:")
print(result)
使用transform进行分组迁移
# 计算每个员工工资占部门总工资的比例
df['工资占比'] = df.groupby('部门')['工资'].transform(lambda x: x / x.sum())
print("各部门工资占比:")
print(df)
实际案例分析
案例:销售数据分析
# 创建销售数据
sales_data = pd.DataFrame({
'日期': pd.date_range('2024-01-01', periods=12, freq='M'),
'产品': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'B', 'A', 'B', 'C', 'A'],
'销售额': [100, 200, 150, 180, 220, 130, 190, 210, 160, 240, 170, 140],
'销售员': ['小明', '小红', '小刚', '小明', '小红', '小刚', '小明', '小红', '小刚', '小明', '小红', '小刚']
})
print("销售数据:")
print(sales_data)
分组迁移操作
# 1. 计算每个产品的累计销售额
sales_data['累计销售额'] = sales_data.groupby('产品')['销售额'].cumsum()
print("各产品累计销售额:")
print(sales_data)
# 2. 计算每个销售员占产品总销售额的比例
sales_data['销售占比'] = sales_data.groupby(['产品', '销售员'])['销售额'].transform('sum')
total_by_product = sales_data.groupby('产品')['销售额'].transform('sum')
sales_data['销售占比'] = sales_data['销售占比'] / total_by_product
print("销售员产品占比:")
print(sales_data)
高级分组迁移操作
使用自定义函数
# 判断是否为部门高薪员工(工资高于部门平均)
def is_high_salary(group):
return group > group.mean()
df['是否高薪'] = df.groupby('部门')['工资'].transform(is_high_salary)
print("高薪判断结果:")
print(df)
# 计算工资排名
df['部门内排名'] = df.groupby('部门')['工资'].rank(ascending=False)
print("部门内排名:")
print(df)
多列分组迁移
# 计算各部门各年龄段工资水平
df['年龄段'] = pd.cut(df['年龄'], bins=[0, 30, 35, 100], labels=['青年', '中年', '壮年'])
# 分组计算
result = df.groupby(['部门', '年龄段']).agg({
'工资': ['mean', 'std'],
'人数': 'count'
}).round(2)
print("部门年龄段分析:")
print(result)
实用技巧
保留原始索引
# 使用reset_index保留分组信息
result_with_index = df.groupby('部门')['工资'].mean().reset_index()
print("部门平均工资(保留索引):")
print(result_with_index)
链式操作
# 链式操作示例
final_result = (df.groupby('部门')
.agg(平均工资=('工资', 'mean'),
人数=('工资', 'count'),
平均年龄=('年龄', 'mean'))
.sort_values('平均工资', ascending=False))
print("部门分析结果:")
print(final_result)
常见问题处理
# 处理缺失值
df_with_na = df.copy()
df_with_na.loc[0, '工资'] = np.nan
# 分组前处理缺失值
df_clean = df_with_na.dropna(subset=['工资'])
result_clean = df_clean.groupby('部门')['工资'].mean()
print("清理后结果:")
print(result_clean)
# 使用fillna填充分组均值
df_filled = df_with_na.copy()
df_filled['工资'] = df_filled.groupby('部门')['工资'].transform(
lambda x: x.fillna(x.mean())
)
print("填充后数据:")
print(df_filled)
Pandas分组迁移的核心要点:
- transform:返回与原DataFrame相同大小的结果
- agg:返回聚合结果
- cumsum/rank:常用的迁移函数
- 自定义函数:灵活实现复杂逻辑
这些技巧在数据分析、报表生成、特征工程等场景中非常实用。