如何用Pandas GroupBy实现特定条件下的分组求和?
解决方法:按分组求和并过滤指定行
方法一:先过滤再分组求和(推荐,效率更高)
先筛选出y列值为m或n的行,再按x列分组对z列求和,是最直接且高效的方式——提前剔除无关行,减少分组计算的数据量:
import pandas as pd df = pd.DataFrame({ 'x': ['A', 'A', 'E' ,'B', 'B', 'C', 'C'], 'y': ['m', 'n', 'q', 'm', 'n', 'm', 'n'], 'z': [6, 5, 10, 4, 3, 2, 1] }) # 过滤y列仅包含'm'/'n'的行 filtered_df = df[df['y'].isin(['m', 'n'])] # 按x分组求和,重置索引并重命名求和列 result = filtered_df.groupby('x')['z'].sum().reset_index(name='sum') print(result)
执行后输出:
x sum 0 A 11 1 B 7 2 C 3
方法二:分组内过滤(适合特殊场景)
如果需要在分组逻辑中直接过滤(比如部分分组混合了有效/无效行),可以用groupby.filter先剔除包含无效y值的分组,再求和:
# 先过滤掉包含y≠'m'/'n'的分组,再求和 result = (df.groupby('x') .filter(lambda group: group['y'].isin(['m', 'n']).all()) .groupby('x')['z'] .sum() .reset_index(name='sum')) print(result)
方法对比
- 方法一的性能更优,因为提前过滤减少了分组处理的数据量,适合大数据集;
- 方法二适合需要对分组整体做有效性判断的场景,但会多一次分组操作,数据量大时效率较低。
内容的提问来源于stack exchange,提问作者lucky1928
相关产品推荐
相关产品推荐

