迭代DataFrame行时报KeyError: '61',如何删除patient列为数字的行
错误原因
- 你循环遍历得到的
i是patient列的取值,不是行索引,直接用df['patient'][i]是把列值当成索引去取对应行,当列值为61但你的DataFrame没有名为61的索引时,自然抛出KeyError - 循环中直接修改DataFrame会导致索引动态偏移,既容易删错行,执行效率也很低
df.drop()的入参需要是要删除的行索引/列名,你传入的是匹配到的行内容,参数格式本身也不正确
正确实现方案
优先用pandas向量化操作实现,不需要写循环:
如果patient列是字符串类型,直接用str.isdigit()判断是否为纯数字,取反后筛选保留不符合删除条件的行即可:
# 直接筛选保留非纯数字的行,效率最高 df = df[~df['patient'].str.isdigit().fillna(False)]
如果需要用drop方法显式删除符合条件的行也可以:
# 显式drop对应行 drop_index = df[df['patient'].str.isdigit().fillna(False)].index df = df.drop(drop_index)
上面的fillna(False)是为了处理patient列有空值的情况,避免判断时报错,如果确认列内没有空值可以去掉。
如果patient列存在混合类型(既有字符串又有整数),需要先统一转成字符串再判断:
df = df[~df['patient'].astype(str).str.isdigit()]
内容的提问来源于stack exchange,提问作者user16309118
相关产品推荐
相关产品推荐

