如何获取Pandas Series的最小值索引?argmin传参报错原因解析
问题解答
1. Pandas Series 获取最小值对应索引的正确方法
日常开发中常用的合规写法有两种,适配不同的定位需求:
- 调用Series自带的
idxmin()方法:该方法会自动跳过空值,直接返回最小值对应的行索引标签,是Pandas官方推荐的Series取值接口,和你代码中写的df['Price'].idxmin()逻辑完全一致,拿到索引标签后可以直接配合loc、iloc做其他字段的行定位。 - 借助numpy接口实现:如果习惯用numpy的数值计算逻辑,可以调用
np.nanargmin(series),该方法返回最小值对应的整数位置序号,需要配合iloc做位置定位,也就是你之前注释掉的两行代码的实现逻辑。
2. argmin() takes 1 positional argument but 2 were given 报错的原因与修正方案
报错根源
这个报错完全是版本适配差异导致的:
- 旧版Pandas中,Series对象的
argmin()方法对齐numpy数组的设计,支持传入axis参数;但在Pandas 2.0及之后的版本中,一维Series本身不存在多轴的维度问题,argmin()方法做了精简,不再接收axis这类额外参数。当你在新版本中沿用老写法,给对象的argmin()方法传入axis参数时,就会因为接收到的位置参数数量和方法定义不匹配,触发这个TypeError。
补充说明:如果链式调用取值时拿到了纯Python标量值,这类值的argmin()方法本身就不支持任何传入参数,传axis也会触发同类报错。
修正方案
根据你的调用场景选择对应写法即可:
- 针对一维Series找最小值索引:不要用带
axis参数的argmin()写法,优先用idxmin()拿索引标签;如果需要整数位置的索引,就把Series转成numpy数组再调用argmin,比如df['Price'].to_numpy().argmin(),numpy数组的argmin完全支持传入axis参数,兼容旧的调用习惯。 - 针对二维DataFrame找跨行/跨列的最小值索引:直接调用DataFrame自带的
idxmin(axis=xxx)方法即可,不需要手动调用底层的argmin方法,该方法原生支持轴参数配置,是官方推荐的二维场景接口。
现有代码的冗余优化
你当前逐字段取值的写法可以简化,拿到最小值对应的索引后直接提取整行数据即可,示例代码:
# 先拿到最小值对应的行索引 min_price_idx = df['Price'].idxmin() # 直接提取整行数据 min_row_info = df.loc[min_price_idx] # 拼接输出 print( f"If you are looking for a cheap accommodation, " f"a {min_row_info['Area']} m² apartment for {min_row_info['Price']} PLN is available in {min_row_info['City']}" )
以上逻辑已经覆盖你当前代码涉及的所有调用场景,两种取索引的方法在空值处理上都能适配你Price列int64类型的数值特征。
内容的提问来源于stack exchange,提问作者Filip Szczybura
相关产品推荐
相关产品推荐

