Pandas DataFrame分词处理时出现KeyError: 31962报错
报错触发原因
你的判断存在偏差:报错根本不是在你给df['clean_tweet']赋值时触发的。对照堆栈的调用链路,错误直接出在循环里的取数行tweet = str(df['clean_tweet'][i]),和后续赋值操作完全无关。
本质是踩了Pandas最常见的索引使用坑:
- 用
df['clean_tweet'][i]取数时,Pandas默认是拿i当行标签(index)去匹配取值,不是按第i行的物理位置拿值。 - 你当前的DataFrame索引根本不是连续从0开始的整数——大概率是之前做过空值过滤、条件筛选、删行操作后没有重置索引,导致行标签出现了跳空:比如行标签走到31961之后,直接跳过了31962,从31963开始往后接,哪怕整个df总共有56745行,31962这个标签也已经不在索引里了。
- 循环里的i是从0数到len(df)-1的位置序号:在i从0到31961的区间,序号刚好和现有行标签完全重合,所以前3万多次循环都能正常取数、打印推文,你会感觉流程已经跑了大半;等i走到31962时,Pandas拿这个值去索引里找标签,发现根本不存在,直接抛KeyError,循环当场中断,根本执行不到后面给列赋值的步骤。
可落地修复方案
- 最小改动修复:把原来的按标签取数换成按物理位置取数,将对应行改为
tweet = str(df['clean_tweet'].iloc[i])。.iloc完全不感知行标签的内容,严格按照行在df里的物理顺序取值,和循环里的i值一一对应,不会出现标签找不到的问题。 - 前置索引修复:在循环开始前加一句
df = df.reset_index(drop=True),强制把df的行标签重置成从0开始的连续整数,后续哪怕还用原来的df['clean_tweet'][i]写法,标签和物理位置完全对齐,也不会触发KeyError。 - 更高效的替代写法:不用手写逐行for循环,直接用Pandas的列级apply完成处理,既不受索引逻辑影响,处理速度也比原生for循环快数倍,示例代码:
ps = PorterStemmer() def process_single_tweet(raw_text): text = str(raw_text).lower() split_words = text.split() stemmed = [ps.stem(word) for word in split_words if word not in stopWords] return ' '.join(stemmed) # 自动逐行匹配对应索引完成处理 df['clean_tweet'] = df['clean_tweet'].apply(process_single_tweet)
内容的提问来源于stack exchange,提问作者Basudev Tyagi
相关产品推荐
相关产品推荐

