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

Pandas条件筛选行后取最大weight对应age出现索引越界问题

问题原因分析
  1. 你调用idxmax()得到的索引是原始df的行标签,不是筛选后weightMax的整数位置索引
  2. Pandas中直接对DataFrame使用[]默认是按列名匹配取值,你传入行标签整数找不到对应列,自然会抛出索引错误
  3. 额外提醒:直接对字符串格式的dob做大小比较存在潜在风险,比如"12/1999"按字符串比较会大于"1/2000",不符合实际日期的大小逻辑,建议先转成日期类型再筛选

正确实现方法

首先统一处理dob字段的格式,再进行筛选取值:

import pandas as pd

df_data = {
    "age": [24, 9, 20, 24],
    "weight": [170, 106, 201, 216],
    "dob": ["1/1990", "1/2000", "2/1994", "1/1990"]
}
df = pd.DataFrame(df_data)

# 1. 把dob转成标准日期格式,避免字符串比较错误
df['dob'] = pd.to_datetime(df['dob'], format='%m/%Y')

# 2. 筛选符合日期范围的行
weight_filtered = df[(df["dob"] >= "1990-01-01") & (df["dob"] <= "2020-01-01")]

方法1:用idxmax+loc取值(和你的原有写法兼容)

# idxmax返回的是原df的行标签,用loc按标签取行
max_weight_row_label = weight_filtered["weight"].idxmax()
# 取整行数据
target_row = weight_filtered.loc[max_weight_row_label]
# 取对应的age值
target_age = target_row['age']

方法2:排序后直接取值(更直观)

# 按weight降序排序后取第一行的age
target_age = weight_filtered.sort_values('weight', ascending=False).iloc[0]['age']

方法3:链式写法(更简洁)

target_age = df.query("'1990-01-01' <= dob <= '2020-01-01'").nlargest(1, 'weight')['age'].iloc[0]

以上三种方法得到的target_age都是24,符合示例数据的预期结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:27:00