Pandas使用groupby分组时按条件选取列值及聚合计算的问题咨询
问题原因
你编写的代码报错核心原因是agg方法中传入的聚合规则必须是可作用于分组后序列的可调用对象、或pandas支持的内置聚合函数字符串,你写的any(completed="Yes")是立即执行的表达式,不是可调用的聚合函数,无法满足自定义聚合逻辑。
正确实现方案
方法1:自定义聚合函数(可读性最优)
我们先单独编写处理completed列分组逻辑的函数,再传入agg中调用:
import pandas as pd import numpy as np # 自定义completed列聚合规则 def agg_completed(s): # 优先判断分组内是否存在Yes if (s == "Yes").any(): return "Yes" # 无Yes时判断是否存在No elif (s == "No").any(): return "No" # 都不存在返回NaN else: return np.nan # 执行分组聚合 df_groupby = df.groupby("sid", as_index=False).agg( score_max = ("score", "max"), completed = ("completed", agg_completed) )
方法2:lambda简写(适合单场景快速实现)
如果不需要复用聚合逻辑,也可以直接用lambda函数简化代码:
df_groupby = df.groupby("sid", as_index=False).agg( score_max = ("score", "max"), completed = ("completed", lambda s: "Yes" if "Yes" in s.values else "No" if "No" in s.values else np.nan) )
验证输出
以上代码运行后得到的df_groupby完全符合你给出的预期结果:
| sid | score_max | completed |
|---|---|---|
| 101 | 70 | No |
| 102 | 56 | Yes |
| 103 | 88 | Yes |
| 105 | 79 | NaN |
内容的提问来源于stack exchange,提问作者floss
相关产品推荐
相关产品推荐

