Pandas问题:使用DataFrame.apply求日期列最大值时出错的原因
问题分析与解决方案
你犯的核心错误是没给apply指定axis=1参数——df.apply()默认按列(axis=0)执行,此时你拿到的row其实是每一列的Series,索引是行标签(Row1、Row2),根本不是你以为的“每行数据”,这直接导致所有索引操作全部失效。
逐个解析错误写法
第一种写法:
row.loc[row.index[0], ['A','B']]
因为row是列Series,row.index[0]是行标签(比如Row1),row.loc[row.index[0]]已经是该列的单个值,再套一层['A','B']相当于给单个值加双重索引,因此报IndexingError: Too many indexers。第二种写法:
row['A','B']row的索引是行标签,不存在('A','B')这个键,且不是多级索引,触发KeyError。第三种写法:
row['A']row的索引是Row1、Row2,没有A这个索引键,同样触发KeyError。
为什么type(row)返回nan?
当apply按列执行时,你返回的type对象无法被pandas转换成DataFrame列支持的标准数据类型(如数值、日期),因此被强制转换为nan。如果指定axis=1,type(row)会正确返回<class 'pandas.core.series.Series'>。
正确写法
方法1:修正apply参数(适合自定义逻辑场景)
指定axis=1让apply按行处理,直接取指定列的最大值,避免重复写row:
df['MaxDate'] = df.apply(lambda row: row[['A', 'B']].max(), axis=1)
方法2:向量化操作(更高效,优先推荐)
完全不需要apply,直接对指定列调用max并指定axis=1,性能远高于apply(尤其大数据量时):
df['MaxDate'] = df[['A', 'B']].max(axis=1)
执行后得到正确结果:
| A | B | MaxDate | |
|---|---|---|---|
| Row1 | 2025-06-05 | 2025-06-06 | 2025-06-06 |
| Row2 | 2025-06-07 | 2025-06-08 | 2025-06-08 |
内容的提问来源于stack exchange,提问作者user2153235
相关产品推荐
相关产品推荐

