Pandas按ID分组条件求和:仅对大于0的Variance计算超支总额
问题原因
你写的代码报错核心有两个问题:
- 你先执行了
df[df['Variance'] > 0]过滤操作,得到的子DataFrame行数比原df少,后续transform返回的结果长度和原df不匹配,无法直接赋值给原df的新列 - 过滤时没有指定只取
Variance列,返回的是包含所有列的DataFrame,transform('sum')会对所有列求和,返回多列结果,所以会提示Wrong number of items passed 8, placement implies 1
解决方案
把过滤逻辑放到分组后的聚合规则里即可,不要提前过滤整个DataFrame,正确代码如下:
df['Overspend Total'] = df.groupby('ID')['Variance'].transform(lambda x: x[x > 0].sum())
代码逻辑说明:
- 按
ID分组后,针对每组的Variance序列x,先筛选出大于0的部分再求和 transform方法会把每组的求和结果,自动广播到组内的所有行,返回的结果长度和原df完全一致,可以直接赋值为新列
内容的提问来源于stack exchange,提问作者Tickets2Moontown
相关产品推荐
相关产品推荐

