Pandas删除Judge列值为WITHDRAWN的行时遇KeyError问题求助
问题分析与解决方案
第一个错误的原因
你这段代码存在两个问题:
adversary_df = adversary_df.drop(adversary_df[adversary_df['Judge'] == 'WITHDRAWN'], axis = 0, inplace = True)
drop方法的第一个参数如果传入整个DataFrame,pandas会误把这个DataFrame的列名当成要删除的列标签(即使指定了axis=0),所以它会去找['Client No.', 'Defendant/Municipality', 'Judge']这些列,自然找不到,触发KeyError。- 同时使用
inplace=True和赋值是错误的:inplace=True会让drop直接修改原DataFrame,返回None,此时adversary_df = ...会把变量覆盖成None,后续操作必然报错。
第二个错误的原因
这段代码的问题在于loc的用法完全错误:
adversary_df = adversary_df.loc([:,'WITHDRAWN'], axis = 0)
loc的调用必须用方括号[],不是圆括号()。loc[:, 'WITHDRAWN']的语义是「选择所有行,列名为'WITHDRAWN'的列」,但你的DataFrame里没有这个列,只有Judge列,所以触发KeyError。你需要的是筛选行,应该把行的条件放在loc的第一个位置。
正确的实现方法
这里提供两种简单可靠的方式:
方法1:布尔索引直接筛选(推荐新手使用)
直接保留Judge列不等于'WITHDRAWN'的行:
adversary_df = adversary_df[adversary_df['Judge'] != 'WITHDRAWN']
方法2:正确使用drop方法
如果想用drop,需要传入符合条件的行的索引,而不是整个DataFrame:
# 不使用inplace,返回新的DataFrame赋值给原变量 adversary_df = adversary_df.drop(adversary_df[adversary_df['Judge'] == 'WITHDRAWN'].index, axis=0) # 或者使用inplace,此时不需要赋值 adversary_df.drop(adversary_df[adversary_df['Judge'] == 'WITHDRAWN'].index, axis=0, inplace=True)
内容的提问来源于stack exchange,提问作者Jeff Gordon
相关产品推荐
相关产品推荐

