本文目录导读:

我来详细介绍使用Pandas进行数据分组重命名的几种常见方法。
基本分组重命名
1 使用 groupby() + agg() + rename()
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'部门': ['技术部', '市场部', '技术部', '市场部', '财务部', '财务部'],
'员工': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
'薪资': [10000, 8000, 12000, 9000, 11000, 9500]
})
print("原始数据:")
print(df)
# 按部门分组,计算平均薪资,并重命名结果列
result = df.groupby('部门')['薪资'].agg(['mean', 'sum', 'count']).rename(
columns={
'mean': '平均薪资',
'sum': '薪资总额',
'count': '人数'
}
)
print("\n分组统计结果:")
print(result)
2 使用 agg() 直接重命名
# 方法1:使用字典直接指定新列名
result2 = df.groupby('部门').agg(
平均薪资=('薪资', 'mean'),
薪资总额=('薪资', 'sum'),
人数=('薪资', 'count')
)
print("\n使用agg直接重命名:")
print(result2)
多列分组重命名
# 创建包含多列的数据
df2 = pd.DataFrame({
'部门': ['技术部', '市场部', '技术部', '市场部', '技术部'],
'年份': [2023, 2023, 2024, 2024, 2024],
'销售额': [100, 200, 150, 180, 120],
'利润': [20, 30, 25, 28, 22]
})
print("\n多列数据:")
print(df2)
# 多列分组,对不同列进行不同聚合
result3 = df2.groupby(['部门', '年份']).agg(
总销售额=('销售额', 'sum'),
平均利润=('利润', 'mean'),
最高销售额=('销售额', 'max')
).reset_index()
print("\n多列分组重命名结果:")
print(result3)
使用 pivot_table 进行分组重命名
# 使用数据透视表
result4 = pd.pivot_table(
df2,
values=['销售额', '利润'],
index=['部门'],
columns=['年份'],
aggfunc={
'销售额': 'sum',
'利润': 'mean'
}
)
# 重命名多层索引
result4.columns = [f'{col[0]}_{col[1]}' for col in result4.columns]
print("\n数据透视表重命名:")
print(result4)
复杂分组重命名案例
# 创建更复杂的示例数据
df3 = pd.DataFrame({
'产品类别': ['电子产品', '食品', '电子产品', '食品', '服装', '服装'],
'产品名称': ['手机', '面包', '电脑', '饼干', 'T恤', '牛仔裤'],
'销售量': [500, 1000, 300, 800, 600, 400],
'单价': [5000, 15, 8000, 10, 100, 200],
'月份': [1, 1, 2, 2, 1, 2]
})
# 计算销售额
df3['销售额'] = df3['销售量'] * df3['单价']
# 复杂分组统计
result5 = df3.groupby(['产品类别', '月份']).agg(
总销售量=('销售量', 'sum'),
平均单价=('单价', 'mean'),
总销售额=('销售额', 'sum'),
产品数量=('产品名称', 'nunique')
).rename(
columns={
'总销售量': '销售总数',
'平均单价': '平均售价'
}
).reset_index()
print("\n复杂分组统计结果:")
print(result5)
使用 NamedAgg 进行重命名
from pandas import NamedAgg
# 使用 NamedAgg 更清晰地指定聚合函数
result6 = df3.groupby('产品类别').agg(
总销售额=NamedAgg(column='销售额', aggfunc='sum'),
平均销售量=NamedAgg(column='销售量', aggfunc='mean'),
最大单价=NamedAgg(column='单价', aggfunc='max'),
最小单价=NamedAgg(column='单价', aggfunc='min')
).round(2)
print("\n使用NamedAgg重命名:")
print(result6)
实用案例:销售数据分析
# 模拟销售数据
sales_data = pd.DataFrame({
'日期': pd.date_range('2024-01-01', periods=30, freq='D'),
'区域': ['华东', '华南', '华北'] * 10,
'产品': ['A', 'B', 'C'] * 10,
'销售额': np.random.randint(1000, 5000, 30),
'数量': np.random.randint(10, 100, 30)
})
print("\n销售数据示例:")
print(sales_data.head())
# 按区域和产品分组统计
monthly_report = sales_data.groupby(['区域', '产品']).agg(
总销售额=('销售额', 'sum'),
平均日销售额=('销售额', 'mean'),
总销量=('数量', 'sum'),
平均单价=('销售额', lambda x: x.sum() / sales_data.loc[x.index, '数量'].sum())
).round(2)
print("\n月度销售报告:")
print(monthly_report)
链式操作重命名
# 使用链式操作
result7 = (df3.groupby('产品类别')
.agg(
总销售=('销售额', 'sum'),
平均单价=('单价', 'mean'),
产品数=('产品名称', 'count')
)
.rename(columns={'总销售': '总营收', '平均单价': '均价'})
.reset_index()
)
print("\n链式操作结果:")
print(result7)
-
三种主要方法:
rename():分组后修改列名agg():直接指定新列名和聚合函数NamedAgg:结构化定义分组聚合
-
常用技巧:
- 使用
reset_index()将分组索引转为列 - 链式操作提高代码可读性
- 结合
round()处理小数精度
- 使用
-
注意事项:
- 确保列名唯一性
- 正确处理多层索引
- 考虑数据类型转换
这些方法可以根据具体需求灵活组合使用,使数据分析结果更加清晰易读。