Pandas条件筛选行后取最大weight对应age出现索引越界问题
问题原因分析
- 你调用
idxmax()得到的索引是原始df的行标签,不是筛选后weightMax的整数位置索引 - Pandas中直接对DataFrame使用
[]默认是按列名匹配取值,你传入行标签整数找不到对应列,自然会抛出索引错误 - 额外提醒:直接对字符串格式的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
相关产品推荐
相关产品推荐

