使用Pandas读取文件并移除-1值后出现KeyError问题求助
解决KeyError问题:正确筛选DataFrame行的方式
看起来你遇到的问题源于拆分列单独处理导致的索引不匹配,还有一个容易忽略的拼写错误,我来一步步帮你解决:
问题分析
- 拼写错误:你代码里多次把
catalog写成了cataog,这会直接触发NameError,不过你提到后续是KeyError,大概率是输入时的笔误,但还是要先修正。 - 错误的筛选方式:你把每个列单独提取成
Series后再用numpy.where筛选,这种方式会让每个筛选后的Series保留原DataFrame的索引(只是删除了部分行)。后续如果用这些Series的索引去关联其他数据(比如原DataFrame或者其他结构),就会因为索引不连续、缺失,触发KeyError。
修正后的代码
直接对整个DataFrame进行筛选,这样所有列的索引会保持一致,后续操作不会出现索引问题:
import pandas as pd columns = ['A', 'B', 'C', 'D'] # 修正拼写错误:cataog -> catalog catalog = pd.read_csv('data.txt', sep='\s+', names=columns, skiprows=1) print(len(catalog['B'])) # 结果为700 # 核心:直接筛选DataFrame,保留B列不等于-1的行 filtered_catalog = catalog[catalog['B'] != -1] print(len(filtered_catalog['B'])) # 结果为612 # 如果需要单独的列,从筛选后的DataFrame提取即可 a = filtered_catalog['A'] b = filtered_catalog['B'] c = filtered_catalog['C'] d = filtered_catalog['D']
为什么这样做更可靠?
- 筛选后的
filtered_catalog是一个完整的DataFrame,所有列的索引完全匹配,不会出现单独Series索引不一致的问题。 - Pandas原生的布尔索引比用
numpy.where更简洁,也更符合Pandas的使用习惯,减少出错概率。 - 后续如果需要对数据做进一步处理(比如合并、分组),直接使用
filtered_catalog即可,不用再担心索引不匹配导致的错误。
内容的提问来源于stack exchange,提问作者aloha
相关产品推荐
相关产品推荐

