You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas DataFrame日期列取最大值:分组聚合KeyError问题解决

问题描述

需要根据列类型使用特定聚合函数合并DataFrame多列,但日期列处理遇到问题:

初始化包含2行数据的DataFrame:

import pandas as pd 

data1 = [['Treuman', 0, 'System_0', '2023-07-21'], ['Treuman', 1, 'System_1', "2023-07-21"]] 
df = pd.DataFrame(data1, columns=['Name', 'Grades', 'Systems', 'Request Date']) 

数据如下:

Name    Grades  Systems Request Date
0   Treuman 0   System_0    2023-07-21
1   Treuman 1   System_1    2023-07-21

按Name列分组聚合的代码:

df = df.groupby(['Name'], as_index=False).agg({'Grades': sum,
                                                'Systems': lambda x: ','.join(x),
                                                'Request Date': lambda g: g.loc[pd.to_datetime(df["Request Date"]).idxmax(skipna=True)]
                                                })

此时能得到预期结果:

Name    Grades  Systems Request Date
0   Treuman 1   System_0,System_1   2023-07-21

但添加新的唯一行数据后:

data2 = [['Treuman', 0, 'System_0', '2023-07-21'], ['Treuman', 1, 'System_1', "2023-07-21"], ['Oldman', 1, 'System_1', "2023-06-21"]] 
df = pd.DataFrame(data2, columns=['Name', 'Grades', 'Systems', 'Request Date'])

执行聚合代码会出现KeyError: 0的报错,希望修改代码支持包含唯一行的场景,得到预期结果:

Name    Grades  Systems Request Date
0   Treuman 1   System_0,System_1   2023-07-21
1   Oldman 1   System_1  2023-06-21
问题排查方向

报错的核心原因是日期列的lambda函数错误引用了全局的df["Request Date"]:

  • pd.to_datetime(df["Request Date"]).idxmax()返回的是整个原始DataFrame中日期最大的行索引(比如示例中是0或1)
  • 但分组后,每个组的子数据(g)只包含当前组的行,比如Oldman组只有索引2的行,此时用g.loc[0]去访问组内不存在的索引,就会触发KeyError
解决方法

修改日期列的聚合逻辑,仅针对当前分组内的数据处理,有两种简洁的实现方式:

方法1:直接取组内日期的最大值

日期字符串格式统一时(YYYY-MM-DD)可以直接比较大小,也可以先转为datetime类型确保准确性:

df = df.groupby(['Name'], as_index=False).agg({'Grades': sum,
                                                'Systems': lambda x: ','.join(x),
                                                'Request Date': lambda g: pd.to_datetime(g).max().strftime('%Y-%m-%d')
                                                })

如果不需要转字符串,直接保留datetime类型可以简化为:

df = df.groupby(['Name'], as_index=False).agg({'Grades': sum,
                                                'Systems': lambda x: ','.join(x),
                                                'Request Date': lambda g: pd.to_datetime(g).max()
                                                })

方法2:基于组内数据取索引最大值

如果需要通过idxmax实现,要确保在组内的Series上操作:

df = df.groupby(['Name'], as_index=False).agg({'Grades': sum,
                                                'Systems': lambda x: ','.join(x),
                                                'Request Date': lambda g: g.iloc[pd.to_datetime(g).idxmax(skipna=True)]
                                                })

这里用g.iloc(按位置索引)替代g.loc,因为pd.to_datetime(g).idxmax()返回的是组内的位置索引(0-based),而不是原始df的全局索引。

内容的提问来源于stack exchange,提问作者Akula1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 06:43:20