Pandas如何按id分组聚合列大小比较的布尔值结果
实现方法
从给出的预期结果反推聚合规则:同一id下,某个比较列只有组内所有行的结果都为True时,聚合后才返回True,只要存在任意一行结果为False,聚合结果就为False,直接用pandas分组的all()聚合即可实现。
完整代码
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'id': [1,1,2,3,3], 'A': [1,5,6,1,4], 'B': [1,7,9,5,6], 'C': [1,2,3,4,2] }) # 生成三个大小比较布尔列 df['a_greater_than_b'] = df['A'] > df['B'] df['b_greater_than_c'] = df['B'] > df['C'] df['c_greater_than_a'] = df['C'] > df['A'] # 按id分组聚合 result = df.groupby('id', as_index=False)[ ['a_greater_than_b', 'b_greater_than_c', 'c_greater_than_a'] ].all()
运行结果
执行代码后得到的输出和预期完全一致:
id a_greater_than_b b_greater_than_c c_greater_than_a 0 1 False False False 1 2 False True False 2 3 False True False
逻辑说明
- 比较列直接用pandas Series向量化运算生成,不需要逐行循环,执行效率更高
groupby('id')按id维度拆分数据块- 传入三个比较列的列表,指定仅对目标字段做聚合,避免无关列参与计算
all()方法会对每个分组内的布尔值做逻辑与判断:组内所有值为True才返回True,否则返回False,完全匹配预期聚合规则- 参数
as_index=False可以让id保留为普通列,不会被设为索引,输出格式和要求一致
内容的提问来源于stack exchange,提问作者l a s
相关产品推荐
相关产品推荐

