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
相关产品推荐
相关产品推荐

