Python案例如何用Pandas做数据分组重命名

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据分组重命名

  1. 基本分组重命名
  2. 多列分组重命名
  3. 使用 pivot_table 进行分组重命名
  4. 复杂分组重命名案例
  5. 使用 NamedAgg 进行重命名
  6. 实用案例:销售数据分析
  7. 链式操作重命名

我来详细介绍使用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)
  1. 三种主要方法

    • rename():分组后修改列名
    • agg():直接指定新列名和聚合函数
    • NamedAgg:结构化定义分组聚合
  2. 常用技巧

    • 使用 reset_index() 将分组索引转为列
    • 链式操作提高代码可读性
    • 结合 round() 处理小数精度
  3. 注意事项

    • 确保列名唯一性
    • 正确处理多层索引
    • 考虑数据类型转换

这些方法可以根据具体需求灵活组合使用,使数据分析结果更加清晰易读。

抱歉,评论功能暂时关闭!