Pandas groupby.all方法使用疑问:结果为何不符合预期?
问题原因
groupby.all()方法的设计逻辑是检查组内每个元素是否都为布尔值True,它不支持传入自定义lambda函数。你传入的lambda x: x["score"] > 2会被直接忽略,实际执行的是对原始score列数值的判断——Pandas里非零数值都会被视为布尔True,所以所有组的结果都返回True。
解决方法
要实现“判断每组所有score是否都大于2”的需求,有几种可行方式:
方式1:先生成布尔列再分组聚合
先把score > 2的结果存为新列,再对该列做groupby.all():
import pandas as pd df = pd.DataFrame({ "user_id": [1,1,1,1,1,2,2,2,3,3,3,3], "score": [1,2,3,4,5,3,4,5,5,6,7,8] }) # 生成布尔判断列 df['score_gt2'] = df['score'] > 2 # 分组聚合 result = df.groupby('user_id')['score_gt2'].all() print(result)
输出:
user_id 1 False 2 True 3 True Name: score_gt2, dtype: bool
方式2:用groupby.apply()自定义聚合逻辑
直接通过apply()传入判断逻辑,对每组的score列做all()判断:
result = df.groupby('user_id').apply(lambda x: (x['score'] > 2).all()) print(result)
输出和方式1一致。
方式3:用transform()将结果映射回原DataFrame
如果需要把判断结果添加到原DataFrame的每一行,用transform():
df['all_score_gt2'] = df.groupby('user_id')['score'].transform(lambda x: (x > 2).all()) print(df)
输出:
user_id score all_score_gt2 0 1 1 False 1 1 2 False 2 1 3 False 3 1 4 False 4 1 5 False 5 2 3 True 6 2 4 True 7 2 5 True 8 3 5 True 9 3 6 True 10 3 7 True 11 3 8 True
内容的提问来源于stack exchange,提问作者Akavall
相关产品推荐
相关产品推荐

