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
相关产品推荐
相关产品推荐

