调试pandas筛选DataFrame时出现KeyError: 'Filter'问题求助
问题描述
我需要实现的功能:让用户输入目标天体名称或多个筛选器名称,获取对应观测数据。我的CSV数据包含Object、HJD 24...、Filter、Magnitude列,记录了SU_Hor、RZ_Lyr等天体的多组观测记录。
编写的Python代码如下:
def searchByFilter(): filter = input('Enter filter to show data \n') df = pd.read_csv('Python_2ndLab.csv') print(df.loc[df['Filter'] == filter, :]) print('Enter 1 to search by object name') print('Enter 2 to search by filter') src = (input('Enter here: ')) if src == '1': searchByObject() elif src == '2': searchByFilter() else: print('Sorry, invalid input')
运行时输入“2”选择按筛选器搜索,接着输入筛选器名称“B”,未得到对应数据反而触发KeyError: 'Filter'错误,完整错误栈如下:
Traceback (most recent call last): File "C:\Users\Acer\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\indexes\base.py", line 3803, in get_loc return self._engine.get_loc(casted_key) File "pandas\_libs\index.pyx", line 138, in pandas._libs.index.IndexEngine.get_loc File "pandas\_libs\index.pyx", line 165, in pandas._libs.index.IndexEngine.get_loc File "pandas\_libs\hashtable_class_helper.pxi", line 5745, in pandas._libs.hashtable.PyObjectHashTable.get_item File "pandas\_libs\hashtable_class_helper.pxi", line 5753, in pandas._libs.hashtable.PyObjectHashTable.get_item KeyError: 'Filter' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Users\Acer\PycharmProjects\2nd Lab\main.py", line 78, in <module> searchByFilter() File "C:\Users\Acer\PycharmProjects\2nd Lab\main.py", line 64, in searchByFilter print(df.loc[df['Filter'] == filter, :]) File "C:\Users\Acer\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\frame.py", line 3805, in __getitem__ indexer = self.columns.get_loc(key) File "C:\Users\Acer\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\indexes\base.py", line 3805, in get_loc raise KeyError(key) from err KeyError: 'Filter'
调试步骤与解决方案
这个错误的核心是pandas读取CSV后找不到名为Filter的列,按以下步骤排查修复:
验证CSV列名准确性
- 直接打开
Python_2ndLab.csv检查第一行列名,确认是否存在拼写错误(比如小写filter)、前后空格(比如Filter或Filter)等问题 - 在代码中新增列名打印语句,直观确认读取到的列名:
def searchByFilter(): df = pd.read_csv('Python_2ndLab.csv') print("CSV列名列表:", df.columns.tolist()) # 新增该行 filter = input('Enter filter to show data \n') print(df.loc[df['Filter'] == filter, :])
- 直接打开
处理CSV读取格式问题
- 如果列名存在前后空格,读取时添加
skipinitialspace=True参数自动去除:df = pd.read_csv('Python_2ndLab.csv', skipinitialspace=True) - 如果CSV使用非逗号分隔符(比如制表符),指定对应分隔符参数:
df = pd.read_csv('Python_2ndLab.csv', sep='\t')
- 如果列名存在前后空格,读取时添加
确认文件路径正确性
- 确保
Python_2ndLab.csv和脚本在同一目录,或使用绝对路径读取避免路径错误:df = pd.read_csv(r'C:\Users\Acer\PycharmProjects\2nd Lab\Python_2ndLab.csv')
- 确保
扩展支持多筛选器输入
- 针对需求中“可输入多个筛选器”的要求,修改代码支持逗号分隔的多筛选器匹配:
def searchByFilter(): df = pd.read_csv('Python_2ndLab.csv', skipinitialspace=True) filters_input = input('Enter filters (comma-separated, e.g. B,V) \n').strip().split(',') filters = [f.strip() for f in filters_input] print(df.loc[df['Filter'].isin(filters), :])
- 针对需求中“可输入多个筛选器”的要求,修改代码支持逗号分隔的多筛选器匹配:
内容的提问来源于stack exchange,提问作者Fika
相关产品推荐
相关产品推荐

