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

Python Pandas按多列值获取列值时报IndexError错误(Python3.5)

解决pandas中IndexError: single positional indexer is out-of-bounds的问题

这个报错本质是说你通过loc筛选出来的结果是空的——根本没有第0个元素可以取。虽然你描述的DataFrame里确实存在fruit=orange且price=5的行,但实际运行时没匹配到,大概率是数据细节的问题,咱们一步步排查:

第一步:先确认筛选结果是否为空

先别着急取iloc[0],先把筛选结果打出来看看,验证有没有匹配到数据:

filtered_city = df.loc[(df['fruit'] == 'orange') & (df['price'] == 5), 'city']
print("筛选结果:", filtered_city)
print("结果长度:", len(filtered_city))

如果输出显示结果长度为0,那说明你的筛选条件和实际数据不匹配,接下来查下面这些常见问题:

常见不匹配原因&解决办法

1. 数据类型不匹配

检查price列的类型,比如如果你的price存的是字符串(比如"5"),而你用整数5去匹配,肯定找不到。用df.dtypes查看列类型:

print(df.dtypes)

如果price是object类型(字符串),先转成整数再查询:

df['price'] = df['price'].astype(int)

2. 字符串存在隐藏空格

比如fruit列的orange前后有空格(比如" orange"或者"orange "),肉眼看不出来,但字符串匹配会直接失败。可以先去除所有字符串列的前后空格:

df['fruit'] = df['fruit'].str.strip()

3. 大小写不一致

如果实际数据里的水果名是Orange(首字母大写),而你用全小写的orange去匹配,也会失败。可以改成忽略大小写的匹配方式:

filtered_city = df.loc[(df['fruit'].str.lower() == 'orange') & (df['price'] == 5), 'city']

更安全的取值方式

如果担心以后还会遇到筛选结果为空的情况,可以用更稳妥的方式取值,避免直接报错:

# 取第一个匹配元素,没有的话返回None
city_name = next(iter(filtered_city), None)

验证正确的测试案例

如果你的数据和描述完全一致,构造DataFrame测试的话,代码是能正常返回结果的:

import pandas as pd

data = {
    'no': [1,2,3,4,5,6],
    'fruit': ['apple', 'apple', 'orange', 'orange', 'Mango', 'Mango'],
    'price': [10,20,5,7,20,15],
    'city': ['Pune', 'Mumbai', 'Nagpur', 'Delhi', 'Bangalore', 'Chennai']
}
df = pd.DataFrame(data)

# 执行查询
print(df.loc[(df['fruit'] == 'orange') & (df['price'] == 5), 'city'].iloc[0])
# 输出:Nagpur

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:56:43