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

使用Pandas读取文件并移除-1值后出现KeyError问题求助

解决KeyError问题:正确筛选DataFrame行的方式

看起来你遇到的问题源于拆分列单独处理导致的索引不匹配,还有一个容易忽略的拼写错误,我来一步步帮你解决:

问题分析

  1. 拼写错误:你代码里多次把catalog写成了cataog,这会直接触发NameError,不过你提到后续是KeyError,大概率是输入时的笔误,但还是要先修正。
  2. 错误的筛选方式:你把每个列单独提取成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:43:59