You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas DataFrame选中修改元素时出现KeyError报错如何解决?

报错原因

  • 核心原因:tweet_features_en的行索引并非english_tweets_2中的推文内容。loc索引是基于行/列的标签匹配,你直接传入推文字符串作为行标签,当行索引是默认的整数序列(0、1、2……)时,自然找不到对应的标签,就会抛出KeyError。
  • 次要可能性:即使你之前尝试将推文设为行索引,也可能因为字符串的隐性差异(比如转义字符、不可见特殊字符、全半角符号差异)导致肉眼看起来相同的字符串实际编码不匹配,无法命中索引。

另外你原代码中tweet_features_en.loc[tweet][trigram_name]属于链式索引,即使索引没问题也容易触发SettingWithCopyWarning,导致修改不生效,建议改为loc[行标签, 列标签]的二维索引写法。

解决方案

方案1:基于行顺序匹配(推荐,兼容性最高)

如果你的tweet_features_en的行顺序和english_tweets_2的顺序完全一一对应(第n行对应english_tweets_2[n]),直接通过下标定位行即可:

for idx, tweet in enumerate(english_tweets_2):
    for trigram_name in truncated_trigrams_list:
        if trigram_name in tweet:
            # 用数字下标定位行,二维索引写法避免链式索引问题
            tweet_features_en.loc[idx, trigram_name] += 1

方案2:显式将推文设为行索引

如果你确实需要用推文内容作为行标签匹配,可以先统一设置索引:

import pandas as pd
# 先将推文内容设置为行索引,确保和english_tweets_2顺序对齐
tweet_features_en = tweet_features_en.set_index(pd.Index(english_tweets_2, name='tweet_content'))

# 后续遍历可直接用推文内容定位行
for tweet in english_tweets_2:
    for trigram_name in truncated_trigrams_list:
        if trigram_name in tweet:
            tweet_features_en.loc[tweet, trigram_name] += 1

性能优化建议

如果数据量较大,双层循环的执行效率很低,可以用pandas向量化操作替代循环:

# 先给tweet_features_en新增一列存储推文内容,确保顺序对齐
tweet_features_en['tweet_content'] = english_tweets_2

for trigram in truncated_trigrams_list:
    # 直接统计每个trigram在每行推文中的出现次数,一行完成统计
    tweet_features_en[trigram] = tweet_features_en['tweet_content'].str.count(trigram)

这个写法性能比双层循环高1~2个数量级,适合处理万条以上的推文数据。

内容的提问来源于stack exchange,提问作者Zendakeen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:45:04