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

为何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中的物理位置,和行的标签没有直接关系。

你的情况中:

  1. idxmax()返回126,这是最大值所在行的标签。
  2. 但你用iloc[126]取的是DataFrame中第127行(因为位置从0开始计数)的元素,而不是标签为126的那一行。
  3. 标签为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:45:42