为何Pandas的idxmax方法无法找到最大的Timestamp值?
pandas中idxmax与iloc配合出错的原因分析
问题场景
我有如下形式的数据:
>>> df['image-capture_time'].iloc[-20:]
43 2022-07-19 20:08:26.603000+00:00 36 2022-07-19 20:08:28.313000+00:00 35 2022-07-19 20:08:29.571000+00:00 40 2022-07-19 20:08:30.796000+00:00 38 2022-07-19 20:08:32.062000+00:00 39 2022-07-19 20:08:33.346000+00:00 42 2022-07-19 20:08:34.579000+00:00 41 2022-07-19 20:08:35.813000+00:00 34 2022-07-19 20:08:37.062000+00:00 37 2022-07-19 20:08:38.314000+00:00 130 2022-07-22 15:12:05.925000+00:00 127 2022-07-22 15:12:07.531000+00:00 122 2022-07-22 15:12:08.765000+00:00 123 2022-07-22 15:12:10.031000+00:00 124 2022-07-22 15:12:11.298000+00:00 129 2022-07-22 15:12:12.548000+00:00 128 2022-07-22 15:12:13.781000+00:00 125 2022-07-22 15:12:15.032000+00:00 121 2022-07-22 15:12:16.298000+00:00 126 2022-07-22 15:12:17.532000+00:00 Name: image-capture_time, dtype: datetime64[ns, UTC]
该列已按pandas.Timestamp递增排序,但使用iloc[df['image-capture_time'].idxmax()]未返回最大时间的记录:
>>> df['image-capture_time'].iloc[df['image-capture_time'].idxmax()]
Timestamp('2022-07-22 15:12:11.298000+0000', tz='UTC')
而直接取最后一条是正确的最大时间:
>>> df['image-capture_time'].iloc[-1]
Timestamp('2022-07-22 15:12:17.532000+0000', tz='UTC')
另外:
>>> df['image-capture_time'].idxmax()
126
>>> df['image-capture_time'].iloc[131]
Timestamp('2022-07-22 15:12:17.532000+0000', tz='UTC')
显然我对iloc、idxmax或是两者存在理解误区,这是怎么回事?
核心原因:混淆标签索引与位置索引
idxmax()返回的是标签索引(label):即该列最大值对应行的索引标签(就是输出里左边的数字,比如这里的126),它是DataFrame行的标识,和行在数据中的位置无关。iloc[]是按**位置索引(position)**取值:它接收从0开始的整数序号,对应数据在DataFrame中的物理位置,和行的标签没有直接关系。
你的情况中:
idxmax()返回126,这是最大值所在行的标签。- 但你用
iloc[126]取的是DataFrame中第127行(因为位置从0开始计数)的元素,而不是标签为126的那一行。 - 标签为126的行对应的位置序号是131(从
iloc[131]能取到最大值可验证),说明你的DataFrame行标签不是连续的,大概率是之前有过删除行、重新索引等操作,导致标签和位置序号不匹配。
正确用法
要获取最大值对应的元素,有三种可靠方式:
- 用
loc[]按标签索引取值(匹配idxmax()的返回类型):
df['image-capture_time'].loc[df['image-capture_time'].idxmax()]
- 直接调用
max()方法获取最大值:
df['image-capture_time'].max()
- 既然数据已排序,直接用
iloc[-1]取最后一行(你已经验证过的方式)。
内容的提问来源于Stack Exchange,提问作者orome
相关产品推荐
相关产品推荐

