Python案例如何用Pandas做数据分组扩展

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据分组扩展

  1. 基础数据准备
  2. 基础分组操作
  3. 分组扩展操作
  4. 高级分组扩展案例
  5. 实用技巧

我来详细说明如何使用Pandas进行数据分组和扩展操作。

基础数据准备

import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
    '部门': ['销售部', '销售部', '技术部', '技术部', '市场部', '市场部', '销售部'],
    '区域': ['华东', '华北', '华东', '华南', '华东', '华北', '华东'],
    '员工': ['张三', '李四', '王五', '赵六', '孙七', '周八', '吴九'],
    '销售额': [100, 150, 200, 180, 120, 90, 160],
    '年龄': [25, 32, 28, 35, 30, 27, 33]
})
print("原始数据:")
print(df)

基础分组操作

# 1. 基本分组聚合
print("按部门分组,计算销售额总和:")
result = df.groupby('部门')['销售额'].sum()
print(result)
# 2. 多列分组
print("\n按部门和区域分组,计算销售额均值:")
result = df.groupby(['部门', '区域'])['销售额'].mean()
print(result)
# 3. 多个聚合函数
print("\n按部门分组,多个聚合函数:")
result = df.groupby('部门')['销售额'].agg(['sum', 'mean', 'max', 'min', 'count'])
print(result)

分组扩展操作

1 transform() 方法

# 1. 计算每个部门的销售额占比
df['部门销售占比'] = df.groupby('部门')['销售额'].transform(lambda x: x / x.sum() * 100)
print("销售额占比:")
print(df[['部门', '员工', '销售额', '部门销售占比']])
# 2. 标准化处理
df['销售额标准化'] = df.groupby('部门')['销售额'].transform(
    lambda x: (x - x.mean()) / x.std()
)
print("\n销售额标准化:")
print(df[['部门', '员工', '销售额', '销售额标准化']])

2 apply() 方法

# 1. 自定义分析函数
def analyze_dept(group):
    return pd.Series({
        '员工数': len(group),
        '平均销售额': group['销售额'].mean(),
        '最高销售额': group['销售额'].max(),
        '平均年龄': group['年龄'].mean()
    })
print("部门分析:")
result = df.groupby('部门').apply(analyze_dept)
print(result)
# 2. 排名
df['销售额排名'] = df.groupby('部门')['销售额'].rank(ascending=False)
print("\n部门内销售额排名:")
print(df[['部门', '员工', '销售额', '销售额排名']])

高级分组扩展案例

案例1:客户RFM分析

# 创建模拟客户数据
np.random.seed(42)
n = 100
customer_data = pd.DataFrame({
    '客户ID': [f'C{str(i).zfill(3)}' for i in range(1, n+1)],
    '消费金额': np.random.randint(100, 5000, n),
    '消费频率': np.random.randint(1, 20, n),
    '最近消费天数': np.random.randint(1, 365, n),
    '会员等级': np.random.choice(['金卡', '银卡', '铜卡'], n, p=[0.2, 0.3, 0.5])
})
# 按会员等级分组分析
def rfm_analysis(group):
    return pd.Series({
        '客户数': len(group),
        '平均消费金额': group['消费金额'].mean(),
        '平均消费频率': group['消费频率'].mean(),
        '平均最近消费天数': group['最近消费天数'].mean(),
        '总消费金额': group['消费金额'].sum()
    })
print("RFM分析结果:")
rfm_result = customer_data.groupby('会员等级').apply(rfm_analysis)
print(rfm_result)
# 添加百分比
rfm_result['客户占比'] = rfm_result['客户数'] / rfm_result['客户数'].sum() * 100
print("\n包含占比的分析结果:")
print(rfm_result)

案例2:时间序列分组扩展

# 创建时间序列数据
dates = pd.date_range('2024-01-01', '2024-12-31', freq='D')
sales_data = pd.DataFrame({
    '日期': dates * 2,
    '产品': ['A'] * 365 + ['B'] * 365,
    '销量': np.random.randint(10, 100, 730)
})
# 按月分组统计
sales_data['月份'] = sales_data['日期'].dt.month
sales_data['季度'] = sales_data['日期'].dt.quarter
# 按月度和产品分组
monthly_stats = sales_data.groupby(['月份', '产品'])['销量'].agg(['sum', 'mean', 'std'])
print("月度销售统计:")
print(monthly_stats.head(10))
# 计算同比
sales_data['上月销量'] = sales_data.groupby('产品')['销量'].transform(lambda x: x.shift(1))
sales_data['月环比'] = (sales_data['销量'] - sales_data['上月销量']) / sales_data['上月销量'] * 100
print("\n月环比分析:")
print(sales_data[sales_data['产品'] == 'A'].head(10))

案例3:分级统计与条件聚合

# 创建员工绩效数据
performance_data = pd.DataFrame({
    '部门': np.random.choice(['销售部', '技术部', '市场部', '财务部'], 200),
    '员工': [f'员工{i}' for i in range(1, 201)],
    '绩效评分': np.random.randint(60, 100, 200),
    '工龄': np.random.randint(1, 15, 200)
})
# 绩效等级分类函数
def performance_level(score):
    if score >= 90:
        return '优秀'
    elif score >= 80:
        return '良好'
    elif score >= 70:
        return '中等'
    else:
        return '需改进'
# 添加绩效等级
performance_data['绩效等级'] = performance_data['绩效评分'].apply(performance_level)
# 多级分组分析
level_analysis = performance_data.groupby(['部门', '绩效等级']).agg({
    '员工': 'count',
    '绩效评分': 'mean',
    '工龄': 'mean'
}).rename(columns={'员工': '人数', '绩效评分': '平均评分', '工龄': '平均工龄'})
print("部门绩效等级分析:")
print(level_analysis)
# 计算各部门各等级占比
dept_totals = performance_data.groupby('部门').size()
level_pct = performance_data.groupby(['部门', '绩效等级']).size().unstack(fill_value=0)
level_pct = level_pct.div(dept_totals, axis=0) * 100
print("\n各部门绩效等级占比(%):")
print(level_pct.round(2))

实用技巧

1 分组后保留原始行

# 使用transform vs 直接分组
df['部门平均销售额'] = df.groupby('部门')['销售额'].transform('mean')
df['部门内排名'] = df.groupby('部门')['销售额'].rank(ascending=False)
print("保留原始行的分组统计:")
print(df[['部门', '员工', '销售额', '部门平均销售额', '部门内排名']])

2 复杂条件分组

# 根据条件创建分组
df['绩效级别'] = pd.cut(df['销售额'], 
                        bins=[0, 100, 150, 200], 
                        labels=['低', '中', '高'])
print("\n按绩效级别分组:")
for level, group in df.groupby('绩效级别'):
    print(f"\n{level}级别组:")
    print(group[['部门', '员工', '销售额']])

这些案例涵盖了Pandas分组扩展的主要应用场景,关键点包括:

  1. transform():保持原始数据行数,进行组内计算
  2. apply():应用自定义函数
  3. agg():多种聚合函数组合
  4. 多级分组:按多个维度分析
  5. 条件分组:根据业务逻辑创建分组

根据具体业务需求,可以灵活组合这些方法来实现复杂的数据分析任务。

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