pandas调用drop删DataFrame行报KeyError: '[17] not found in axis'
DataFrame按索引删行触发
KeyError: '[17] not found in axis'问题解决 报错原因
当前写的遍历删除逻辑存在两个致命问题,直接导致索引找不到的报错:
- 遍历初始拿到的索引范围是DataFrame最开始的长度,但是每执行一次删除操作,DataFrame的总行数就会减少,原有行索引不会自动重置,当循环走到i=17时,索引为17的行要么已经在之前的删除操作中被移除,要么当前表内根本不存在对应索引值,自然触发找不到轴上索引的错误。
drop()方法默认不会修改原DataFrame,只会返回删除后的新对象,当前写法就算不报错,原变量tweets_df1也不会发生任何变化。
可行解决方案
不要用逐行遍历+循环删除的写法,pandas做行筛选直接用布尔索引一次性处理即可,效率更高也不会出现索引错位问题。
最简实现(直接筛除目标行)
# 保留所有Text列不包含https的行,覆盖原变量 tweets_df1 = tweets_df1[~tweets_df1['Text'].str.contains('https')]
需要打印被删行索引的实现
如果需要保留打印被删行索引的逻辑,可以先定位所有待删除行再统一操作:
# 标记所有包含https的待删除行 delete_mask = tweets_df1['Text'].str.contains('https') # 提取待删除行的索引并打印 for del_idx in tweets_df1[delete_mask].index: print(del_idx) # 一次性删除所有目标行 tweets_df1 = tweets_df1.drop(index=tweets_df1[delete_mask].index, axis=0)
说明:代码中
str.contains('https')是pandas内置的字符串匹配方法,比逐行遍历调用find()的执行效率高很多,符号~是布尔取反操作,代表筛选不符合匹配规则的行。给出的包含链接文本的样例行,会被该逻辑准确识别并筛除。
内容的提问来源于stack exchange,提问作者svmmy_776
相关产品推荐
相关产品推荐

