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
相关产品推荐
相关产品推荐

