Pandas中满足条件后按分组统计指定列求和的实现问题
解决Pandas中按条件过滤后分组求和的问题
你的需求是仅对B>2的行,按列A分组统计列C的和,并将结果匹配到原DataFrame对应行,预期a的总和为3(0+1+2)、b的总和为9(9),但当前代码计算的是全部分组的C总和,导致结果不符合预期。
问题原因
当前代码中的df.groupby('A')['C'].transform('sum')是对每个分组的所有行计算C的总和,没有过滤B>2的条件,因此得到的是:
a组:9+0+1+2=12b组:9+9=18
这和你想要的仅统计B>2行的需求不符。
解决方案
先筛选出B>2的行进行分组求和,再将结果映射回原DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame(dict(A=list('ababaa'), B=[1, 1, 3, 4, 5, 6], C=[9, 9, 0, 9, 1, 2])) # 1. 计算符合条件的分组求和结果 filtered_sum = df[df['B'] > 2].groupby('A')['C'].sum() # 2. 将结果映射到原DataFrame,无匹配项填充为0并转整数 df['Count'] = df['A'].map(filtered_sum).fillna(0).astype(int)
正确输出
A B C Count 0 a 1 9 0 1 b 1 9 0 2 a 3 0 3 3 b 4 9 9 4 a 5 1 3 5 a 6 2 3
方案说明
- 先通过
df[df['B'] > 2]筛选出满足条件的行,再对这个子集按A分组求和,得到每个分组的正确统计值。 - 使用
map方法将每个A对应的求和结果匹配到原DataFrame的每一行,对于不满足B>2的行,因为没有匹配结果会生成NaN,最后用fillna(0)填充为0并转为整数类型。
内容的提问来源于stack exchange,提问作者Chopin
相关产品推荐
相关产品推荐

