pandas按grp分组独立聚合min、max列极值的实现方法
Pandas 分组聚合实现
核心逻辑:Pandas 的分组聚合支持为不同列指定独立的聚合规则,无需单独筛选单列计算,可直接匹配“每组取min列最小值、max列最大值”的需求。
推荐实现:命名聚合(无列名歧义,pandas 0.25+ 支持)
这种写法逻辑清晰,不会出现列名混淆,是当前最推荐的实现方式:
# 先确保min、max列为datetime类型,避免时间排序出错 df[["min", "max"]] = df[["min", "max"]].apply(pd.to_datetime) result = df.groupby("grp", as_index=False).agg( min=("min", "min"), # 输出列"min":对原始min列取分组最小值 max=("max", "max") # 输出列"max":对原始max列取分组最大值 )
该代码的输出完全符合预期,以grp=6为例,聚合结果为:
min值:2013-10-13 21:51:21(本组所有min列的最早时间)max值:2013-10-15 04:07:45(本组所有max列的最晚时间)
兼容旧版本写法
如果使用较早版本的Pandas,可通过传入列与聚合规则的字典实现,效果完全一致:
result = df.groupby("grp").agg({ "min": "min", "max": "max" }).reset_index()
原写法的偏差原因
你之前尝试的df.groupby(['grp'])['min'].agg(['min','max']).reset_index(),执行链路是先筛选min列,仅针对该列计算分组下的最小值、最大值,全程未访问原始max列的数据,因此无法得到预期结果。
内容的提问来源于stack exchange,提问作者iskandarblue
相关产品推荐
相关产品推荐

