Python案例如何用Pandas做数据分组降维

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据分组降维

  1. 案例1:基础分组聚合(最常用)
  2. 案例2:多维度分组降维
  3. 案例3:实际业务场景
  4. 案例4:分组后的变换与透视
  5. 案例5:复杂分组降维操作
  6. 实用技巧

我来用具体案例说明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)

核心要点:

  1. groupby() 是分组降维的核心函数
  2. agg() 指定聚合方式,可以是多个函数
  3. reset_index() 将分组索引转为普通列
  4. pivot_table() 实现数据透视
  5. transform() 保持原数据维度添加统计值

这些方法能帮你有效处理数据的分类汇总和降维分析。

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