本文目录导读:

我来为您详细介绍如何使用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:常用的迁移函数
- 自定义函数:灵活实现复杂逻辑
这些技巧在数据分析、报表生成、特征工程等场景中非常实用。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播