如何筛选Pandas DataFrame groupby聚合后满足数值阈值的分组
Pandas 对groupby聚合结果按阈值筛选分组
直接对分组聚合得到的序列做布尔索引筛选,就能保留符合聚合值阈值的分组,不需要额外复杂逻辑。
复现示例场景
首先构造测试数据:
import pandas as pd df = pd.DataFrame({ 'Name': ['Fred', 'Harry', 'Sonia', 'Pete', 'Tracy'], 'Thing': ['Apple', 'Banana', 'Banana', 'Apple', 'Apple'], 'Count': [1, 1, 1, 1, 1] })
执行原有聚合逻辑:
agg_res = df.groupby(["Thing"])['Count'].sum()
得到的聚合输出为:
Thing Apple 3 Banana 2 Name: Count, dtype: int64
注:原写法
df.groupby(["Thing"]).sum()['Count']可以优化为上面的写法,分组时直接指定要聚合的Count列,避免无意义的全数值列聚合,运行效率更高。
实现聚合结果筛选
直接给聚合结果传入布尔判断条件做索引,就能保留聚合值大于指定阈值的分组,要保留Count总和大于2的分组,代码如下:
filtered_agg = agg_res[agg_res > 2]
执行后输出的结果为:
Thing Apple 3 Name: Count, dtype: int64
扩展:如果需要保留原表中符合阈值的所有原始行
如果不是要聚合后的统计结果,而是要筛选原DataFrame里「所属分组聚合值满足阈值」的所有原始行,可以用groupby.filter方法:
# 筛选原表中,所属Thing分组的Count总和大于2的所有行 filtered_raw_df = df.groupby("Thing").filter(lambda group: group['Count'].sum() > 2)
执行后输出原表中所有Apple对应的行:
Name Thing Count 0 Fred Apple 1 3 Pete Apple 1 4 Tracy Apple 1
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

