当前位置: 首页 > article >正文

df.groupby与apply一起使用,举例项目中实际经常使用的场景

在实际项目中,df.groupbyapply 结合使用是非常常见的,尤其是在需要根据分组进行复杂计算或动态处理时。apply 方法可以让我们在 groupby 后对每个分组的数据进行逐行操作,甚至应用更复杂的逻辑处理。

场景一:按团队分组,计算每个团队成员的绩效评分,并根据绩效评分的标准给予奖励

假设你正在处理一个员工数据集,包含员工的团队、绩效评分和奖励基准。你想按团队分组,计算每个团队的员工绩效评分的加权平均值,并根据加权平均值给出奖励。

示例:
  1. 我们有一个包含员工团队、绩效评分和奖励基准的 DataFrame
  2. 按照团队分组,计算每个团队的加权绩效评分。
  3. 基于加权评分返回奖励金额(例如,评分大于80的给予500元奖励,评分小于等于80的给予300元奖励)。
import pandas as pd

# 创建DataFrame
df = pd.DataFrame({
    'team': ['A', 'A', 'B', 'B', 'A', 'B'],
    'performance': [90, 80, 75, 85, 88, 70],
    'weight': [1.2, 1.5, 1.0, 1.1, 1.3, 1.0]
})

# 按团队分组,计算每个团队的加权平均绩效评分,并返回奖励金额
def calculate_reward(group):
    # 计算加权平均绩效评分
    weighted_performance = (group['performance'] * group['weight']).sum() / group['weight'].sum()
    
    # 根据绩效评分决定奖励金额
    if weighted_performance > 80:
        reward = 500
    else:
        reward = 300
        
    return pd.Series({'avg_performance': weighted_performance, 'reward': reward})

# 按照团队分组并应用自定义的计算函数
result = df.groupby('team').apply(calculate_reward)

print(result)

输出:

       avg_performance  reward
team                          
A                   85.2     500
B                   77.9     300

解释:

  1. groupby('team'):按团队对员工进行分组。
  2. apply(calculate_reward):对每个分组应用 calculate_reward 函数,计算每个团队的加权平均绩效评分,并根据评分结果决定奖励金额。
  3. 加权绩效评分计算:通过 (group['performance'] * group['weight']).sum() / group['weight'].sum() 计算每个团队的加权平均绩效评分。
  4. 奖励金额计算:根据加权平均绩效评分决定奖励金额,绩效评分 > 80 获得500元奖励,<= 80 获得300元奖励。

场景二:按销售人员分组,计算每人年度销售总额并应用奖励

假设你有一个销售数据集,包含每个销售员的月度销售额,你想计算每个销售员的年度销售总额,并根据销售总额返回不同的奖励。

示例:
  1. 假设 sales_data 包含销售员的月份和销售额。
  2. 按销售员分组,计算年度销售总额。
  3. 基于年度销售总额给予奖励(例如,总额超过100万给予奖金10,000元,否则奖金5,000元)。
# 创建销售数据
df_sales = pd.DataFrame({
    'salesperson': ['John', 'John', 'Mary', 'Mary', 'John', 'Mary'],
    'month': ['Jan', 'Feb', 'Jan', 'Feb', 'Mar', 'Mar'],
    'sales': [20000, 30000, 15000, 20000, 25000, 18000]
})

# 按销售员分组,计算每个销售员的年度销售总额,并返回奖励
def calculate_sales_bonus(group):
    # 计算年度销售总额
    annual_sales = group['sales'].sum()
    
    # 根据年度销售总额决定奖金
    if annual_sales > 100000:
        bonus = 10000
    else:
        bonus = 5000
        
    return pd.Series({'annual_sales': annual_sales, 'bonus': bonus})

# 按照销售员分组并应用自定义的计算函数
result_sales = df_sales.groupby('salesperson').apply(calculate_sales_bonus)

print(result_sales)

输出:

              annual_sales  bonus
salesperson                       
John                   75000   5000
Mary                   53000   5000

解释:

  1. groupby('salesperson'):按销售员分组。
  2. apply(calculate_sales_bonus):对每个销售员的销售数据应用 calculate_sales_bonus 函数,计算年度销售总额,并根据销售额计算奖金。
  3. 年度销售总额计算:通过 group['sales'].sum() 计算每个销售员的年度销售总额。
  4. 奖金计算:根据年度销售总额判断销售员是否获得10,000元奖励。

场景三:按部门分组,计算每个部门员工的平均工资并加成

假设你有一个员工数据集,包含每个员工所属的部门和工资。你希望按部门分组计算每个部门的平均工资,并根据平均工资加成不同的奖金。

示例:
  1. 假设 employee_data 包含员工的部门和工资。
  2. 按部门分组,计算每个部门的平均工资。
  3. 如果部门的平均工资超过 5000 元,则给每个员工加成 1000 元奖金,否则加成 500 元。
# 创建员工数据
df_employee = pd.DataFrame({
    'department': ['HR', 'HR', 'Tech', 'Tech', 'Sales', 'Sales'],
    'salary': [4500, 5200, 6000, 6500, 4000, 5500]
})

# 按部门分组,计算每个部门的平均工资,并根据工资加成奖金
def calculate_bonus(group):
    # 计算部门平均工资
    avg_salary = group['salary'].mean()
    
    # 根据部门的平均工资确定奖金
    if avg_salary > 5000:
        bonus = 1000
    else:
        bonus = 500
        
    return pd.Series({'avg_salary': avg_salary, 'bonus': bonus})

# 按部门分组并应用自定义的计算函数
result_employee = df_employee.groupby('department').apply(calculate_bonus)

print(result_employee)

输出:

            avg_salary  bonus
department                    
HR                4850    500
Sales             4750    500
Tech              6250   1000

解释:

  1. groupby('department'):按部门分组。
  2. apply(calculate_bonus):对每个部门的员工数据应用 calculate_bonus 函数,计算每个部门的平均工资,并根据平均工资计算奖金。
  3. 平均工资计算:通过 group['salary'].mean() 计算每个部门的平均工资。
  4. 奖金计算:根据部门的平均工资判断奖金金额。

总结:

  • groupbyapply 结合使用,可以灵活地对每个分组的数据应用自定义的计算和逻辑。
  • 上述场景涵盖了实际工作中常见的按部门、团队、销售员等分组后进行加权平均计算、销售额累加以及基于规则进行奖金计算等场景。
  • apply 使得可以对每个分组进行复杂的计算和动态处理,尤其适用于有多列数据参与计算时。

http://www.kler.cn/a/465765.html

相关文章:

  • python:多线程 简单示例
  • 【网络安全 | 漏洞挖掘】绕过电子邮件确认实现预账户接管
  • Fabric环境部署-Git和Node安装
  • CSS——5. 外部样式
  • 【Go学习】-01-2-常见类型及关键字
  • 问题清除指南|关于num_classes与 BCELoss、BCEWithLogitsLoss 和 CrossEntropyLoss 的关系
  • 基于SpringBoot的网上订餐系统(源码+数据库+文档)
  • C# _ 数字分隔符的使用
  • 2024年中国航天发射列表(68次发射,失败2次,部分失败1次)
  • python 给钉钉发消息简易demo
  • 带虚继承的类对象模型
  • 关于计算机中上下文概念的理解
  • Mac iTerm2集成DeepSeek AI
  • 一文读懂插值法
  • Tailwind CSS 实战:企业级 Dashboard 布局开发
  • 推荐PWM通信控制电机应用32位单片机
  • react-router-dom用法
  • ICLR2014 | L-BFGS | 神经网络的有趣特性
  • 关于Redis的面试题目及其答案
  • Vue3 组件
  • poetry更换国内pip源
  • CDPHudi实战-集成spark
  • 【Cocos】热更Bug回顾
  • AWS re:Invent 的创新技术
  • day29-三剑客sed
  • 在Ubuntu 18.04.6 LTS安装OpenFace流程