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

Python中groupby结合Lambda实现sumif阈值计数与求和问题

解决方案

问题成因

你当前代码返回的是符合条件的交易计数,原因是(x>阈值).sum()的逻辑是对布尔值序列求和:x>阈值会返回由True/False组成的序列,Python中True等价于1、False等价于0,求和后得到的自然是符合条件的交易笔数,而非金额总和。

修改方案

如果要同时统计每个阈值下的交易笔数、对应总金额,只需要为每个阈值新增单独的金额聚合规则即可,示例代码如下:

import pandas as pd

test = df.groupby('Customer Name').agg(
    # 原有基础统计字段
    Credit_Card_Trans = pd.NamedAgg('USD Amount', 'sum'),
    Avg = pd.NamedAgg('USD Amount', 'mean'),
    Total_Trans_Count = pd.NamedAgg('USD Amount', 'count'),
    # 100k以上统计:笔数+总金额
    k100_count = pd.NamedAgg('USD Amount', lambda x: (x>100000).sum()),
    k100_amount = pd.NamedAgg('USD Amount', lambda x: x[x>100000].sum()),
    # 10k以上统计:笔数+总金额
    k10_count = pd.NamedAgg('USD Amount', lambda x: (x>10000).sum()),
    k10_amount = pd.NamedAgg('USD Amount', lambda x: x[x>10000].sum()),
    # 5k以上统计:笔数+总金额
    k5_count = pd.NamedAgg('USD Amount', lambda x: (x>5000).sum()),
    k5_amount = pd.NamedAgg('USD Amount', lambda x: x[x>5000].sum()),
    # 1k以上统计:笔数+总金额
    k1_count = pd.NamedAgg('USD Amount', lambda x: (x>1000).sum()),
    k1_amount = pd.NamedAgg('USD Amount', lambda x: x[x>1000].sum())
).sort_values(by = 'Credit_Card_Trans', ascending = False)

print(test)

逻辑说明

金额统计的核心逻辑是先通过布尔索引筛选出符合阈值的金额值,再对筛选后的数值求和:x[x>阈值].sum(),而非对布尔值本身求和。
按照你给出的示例数据,输出结果会新增k10_amount字段,对应值就是4笔大于10k的交易总金额。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:27:03