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
相关产品推荐
相关产品推荐

