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

Pandas使用布尔逻辑过滤行时出现KeyError: True的解决方法

解决Pandas中筛选数据时的KeyError: True问题

这个报错我太熟了,本质是你把布尔值/布尔数组用错地方了——Pandas把你传入的布尔值当成了要找的列名或索引标签,而你的DataFrame里根本没有叫True的列/索引,自然就报错了。

错误原因分析

你大概率写了类似下面的错误代码:

# 错误写法1:直接把布尔数组传给drop,drop默认认作标签
data2.drop(data2['RA'].str.startswith('126.1') == False)
# 错误写法2:用is False得到单一布尔值,然后用data2[True]访问
data2[data2['RA'].str.startswith('126.1') is False]

第一种情况里,drop方法默认接收的是索引/列标签,你传布尔数组它就会把True/False当成标签去找,找不到就报KeyError;第二种情况里,is False会把整个Series和False对象比较,返回一个单一的布尔值(比如True),然后data2[True]就会去找名为True的列,自然找不到。

正确的修复方法

下面给你两种靠谱的写法,选一种就行:

方法1:直接用布尔索引筛选(推荐)

先确保RA列是字符串类型(如果原本是数值型,必须转,不然str.startswith用不了),然后用布尔索引保留你需要的行(等价于删除不需要的):

# 第一步:把RA列转为字符串(如果是数值型的话)
data2['RA'] = data2['RA'].astype(str)
# 第二步:筛选保留以'126.1'开头的行,覆盖原DataFrame
data2 = data2[data2['RA'].str.startswith('126.1')]

如果是要删除以126.1开头的行,就用~取反:

data2 = data2[~data2['RA'].str.startswith('126.1')]

如果RA列有NaN值,建议先处理掉,避免筛选出错:

# 先删除RA为空的行
data2 = data2.dropna(subset=['RA'])
data2['RA'] = data2['RA'].astype(str)
# 再筛选
data2 = data2[data2['RA'].str.startswith('126.1')]

方法2:用drop配合索引删除

如果你习惯用drop方法,那就先拿到要删除的行的索引,再传给drop:

# 先处理类型和NaN(同上)
data2['RA'] = data2['RA'].astype(str)
data2 = data2.dropna(subset=['RA'])
# 获取要删除的行的索引
rows_to_remove = data2[~data2['RA'].str.startswith('126.1')].index
# 删除这些行
data2 = data2.drop(rows_to_remove)

最后提醒

别再用is False来判断Series的元素了,要用== False或者更简洁的~;另外,drop方法默认操作的是行/列标签,不是布尔数组,一定要传索引或者列名才行。

内容的提问来源于stack exchange,提问作者user7983290

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:27:36