You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于多函数对Pandas分组数据计算综合得分?

如何在Pandas分组中应用多规则计算得分总和?

我来帮你解决这个Pandas分组计算得分的问题,咱们一步步梳理:

问题背景

你有如下原始数据集:

group_id code amount date
1 100 20 2017-10-01
1 100 25 2017-10-02
1 100 40 2017-10-03
1 100 25 2017-10-03
2 101 5 2017-11-01
2 102 15 2017-10-15
2 103 20 2017-11-05

需要按group_id分组,根据三个规则计算每个分组的总得分,并将得分赋值给分组内的每一行,最终得到预期结果。

原函数的问题说明

你提供的date_diff_score函数存在两个问题:

  1. 函数内使用了未定义的score变量,逻辑不通
  2. 使用inplace=True修改原数据,可能会导致意外的副作用

下面是修正后的完整实现方案:

完整实现代码

1. 导入依赖并创建数据集

首先确保你的date列是datetime类型,否则无法计算日期差值:

import pandas as pd
import numpy as np

# 创建原始数据集
data = {
    'group_id': [1,1,1,1,2,2,2],
    'code': [100,100,100,100,101,102,103],
    'amount': [20,25,40,25,5,15,20],
    'date': ['2017-10-01','2017-10-02','2017-10-03','2017-10-03','2017-11-01','2017-10-15','2017-11-05']
}
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])  # 转换为datetime类型

2. 修正得分函数并定义总得分逻辑

我们把三个规则的得分计算拆分成独立函数,再写一个总得分函数将它们相加:

def amount_score(df, amount_col, thold=100):
    """规则2:amount总和超过阈值得20分,否则0分"""
    return 20 if df[amount_col].sum() > thold else 0

def col_uniq_score(df, col_name):
    """规则1:分组内code全部相同得0分,否则10分"""
    return 0 if df[col_name].nunique() == 1 else 10

def date_diff_score(df, col_name):
    """规则3:日期差值总和<5天得30分,否则0分"""
    # 对分组内日期降序排序(用副本,不修改原数据)
    sorted_group = df.sort_values(by=col_name, ascending=False)
    # 计算日期差值并转成天数求和
    total_diff_days = sorted_group[col_name].diff().dropna().dt.days.sum()
    return 30 if total_diff_days < 5 else 0

def calculate_total_score(group):
    """计算分组的总得分"""
    score1 = col_uniq_score(group, 'code')
    score2 = amount_score(group, 'amount')
    score3 = date_diff_score(group, 'date')
    return score1 + score2 + score3

3. 应用分组计算得分

使用groupby.transform()方法,这个方法会将分组计算的结果广播到原DataFrame的每一行,完美匹配需求:

df['score'] = df.groupby('group_id').transform(calculate_total_score)

4. 查看结果

运行后输出的df就是你想要的预期结果:

group_id  code  amount       date  score
0         1   100      20 2017-10-01     50
1         1   100      25 2017-10-02     50
2         1   100      40 2017-10-03     50
3         1   100      25 2017-10-03     50
4         2   101       5 2017-11-01     10
5         2   102      15 2017-10-15     10
6         2   103      20 2017-11-05     10

关键要点解释

  • groupby.transform():它的核心作用是将分组级别的计算结果映射回原DataFrame的每一行,不需要手动合并数据,非常适合这种给分组内所有行赋值相同得分的场景。
  • 避免inplace=True:使用副本排序可以防止修改原始数据的顺序,减少潜在的bug。
  • 拆分函数:将每个规则拆成独立函数,代码更清晰,也方便后续修改单个规则的逻辑。

内容的提问来源于stack exchange,提问作者daiyue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:21:10