如何在Pandas DataFrame中查找字符串在列中的整数行索引?
如何在Pandas DataFrame中查找字符串在列中的整数行索引?
看起来你遇到的问题核心是大小写不匹配导致筛选不到数据,进而触发了索引越界的错误,我来一步步帮你排查和解决:
先说说你的错误原因
你执行了df1['name'].str.lower(),但没有把转换后的结果赋值回原DataFrame的name列——这意味着原DataFrame里的name列还是原来的大写格式(比如P1、P2),而你要搜索的是小写的'p1',自然匹配不到任何行。这时候df1[df1['name'] == name_to_search]返回的是一个空DataFrame,再去取它的index[0],肯定会报“索引越界”的错误。
解决方案
1. 先解决大小写匹配问题
有两种思路统一大小写:
- 把DataFrame的
name列永久转成小写(或者大写),后续搜索就不用再处理了:
df1 = pd.read_csv(filepath_or_buffer='file.csv', header=[0]) df1['name'] = df1['name'].str.lower() # 关键:把转换结果赋值回原列 name_to_search = 'p1'
- 或者保持原列不变,仅在搜索时临时转换大小写:
df1 = pd.read_csv(filepath_or_buffer='file.csv', header=[0]) name_to_search = 'p1' # 搜索时统一转成小写对比 matching_rows = df1[df1['name'].str.lower() == name_to_search]
2. 安全获取行索引(避免索引越界)
不管用哪种大小写处理方式,都要先检查是否有匹配的行,再去取索引:
# 获取所有匹配行的索引 matching_indices = df1[df1['name'].str.lower() == name_to_search].index if len(matching_indices) > 0: row_indx1 = matching_indices[0] # 取第一个匹配行的整数索引 else: print(f"没有找到名称为 {name_to_search} 的行") row_indx1 = -1 # 用-1或者其他值标记“未找到”
更简洁的替代方法
你也可以用numpy.where直接获取匹配的整数索引:
import numpy as np matches = np.where(df1['name'].str.lower() == name_to_search)[0] if len(matches) > 0: row_indx1 = matches[0] else: row_indx1 = -1
额外小提醒
如果你的CSV文件里,列值后面带有空格(比如你示例里的P1, 1,1,1,逗号后有空格),读取的时候可以加上skipinitialspace=True参数,避免列值带空格导致匹配失败:
df1 = pd.read_csv(filepath_or_buffer='file.csv', header=[0], skipinitialspace=True)
以后遇到类似的索引越界错误,建议先单独打印筛选后的DataFrame(比如print(df1[df1['name'] == name_to_search])),看看是不是空的——这样能快速定位到是筛选条件的问题,而不是索引获取的问题哦!
备注:内容来源于stack exchange,提问作者ewr3243
相关产品推荐
相关产品推荐

