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

如何对Pandas中groupby分组后的每组应用自定义得分计算函数?

Pandas Groupby自定义得分函数问题解决

错误点分析

  1. 字符串匹配错误:原始数据中DPP列的 promoter 值是Promoter,但你定义的函数里写成了Promoters(多了末尾的s),导致无法正确统计数量。
  2. 调用语法错误:df.groupby('Cust_type').apply(score, x))存在两处问题:一是apply会自动将每个分组的子DataFrame传入score函数,不需要手动传递x参数;二是末尾多了一个括号,触发语法报错。

修正后的完整代码

import pandas as pd

# 构造原始DataFrame
data = {
    'Id': [1,2,3,4,5,6,7,8,9,10,11,12],
    'Cust_type': ['A','B','C','D','A','B','B','C','D','D','A','A'],
    'DPP': ['Detractor','Detractor','Detractor','Promoter','Promoter','Passive','Detractor','Detractor','Detractor','Promoter','Promoter','Passive']
}
df = pd.DataFrame(data)

# 修正后的得分计算函数
def score(x):
    promoter_num = len(x[x['DPP'] == 'Promoter'])
    detractor_num = len(x[x['DPP'] == 'Detractor'])
    total = len(x)
    return ((promoter_num - detractor_num) / total) * 100

# 正确调用groupby.apply
grouped_score = df.groupby('Cust_type').apply(score)
print(grouped_score)

运行后输出:

Cust_type
A    25.000000
B   -66.666667
C  -100.000000
D     0.000000
dtype: float64

更高效的优化写法

如果处理大数据量,推荐用value_counts来统计各类别数量,避免多次子DataFrame切片,提升性能:

def score_optimized(x):
    count_dict = x['DPP'].value_counts().to_dict()
    promoter = count_dict.get('Promoter', 0)
    detractor = count_dict.get('Detractor', 0)
    total = sum(count_dict.values())
    return ((promoter - detractor) / total) * 100

grouped_score_optimized = df.groupby('Cust_type').apply(score_optimized)
print(grouped_score_optimized)

输出结果和之前一致,但运行效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:30:56