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

对数据集筛选子集执行情感分析时触发KeyError:0,求解决(附代码)

解决情感分析中的KeyError: 0问题

嘿,我帮你排查下这个KeyError: 0的问题,大概率是索引或者数据集状态的问题,咱们一步步来解决:

先确认筛选后的数据集是否有效

首先你得先检查OC这个筛选出来的子集是不是真的有数据。有时候原数据集里可能根本没有包含"Obamacare"的文本,导致OC是空的DataFrame,这时候你去访问索引0自然会报错。

你可以先运行这两行代码看看:

print("筛选后的数据集行数:", OC.shape[0])
print(OC.head())

如果输出的行数是0,那你得先确认原df里的text列确实有包含"Obamacare"的内容——可能是大小写问题?比如原文本是"obamacare"小写,你可以把筛选条件改成df["text"].str.contains("Obamacare", case=False)来忽略大小写。

解决索引不连续的问题

如果OC有数据,但还是触发KeyError:0,那大概率是筛选后保留了原数据集的索引,导致索引不是从0开始连续的。比如原df里符合条件的行索引是5、12、18,那你直接写OC["text"][0]就会找不到索引0。

解决办法有两个:

  • 重置索引:在筛选后加上reset_index(drop=True),这样新的DataFrame索引就会从0开始:
    OC = df[df["text"].str.contains("Obamacare")].reset_index(drop=True)
    
  • 按位置访问:不用索引值,用iloc按位置取数据,比如OC["text"].iloc[0],不管原索引是什么,都能取到第一行的文本。

完善你的情感分析函数

另外我注意到你贴的代码里analize_sentiment函数没写完(elif ana...),这会导致语法错误,先把函数补全:

def analize_sentiment(tweet):
    # 先处理空值或非字符串的情况,避免报错
    if not isinstance(tweet, str) or not tweet.strip():
        return 0  # 或者根据你的需求返回中性、空值标记等
    analysis = TextBlob(clean_tweet(tweet))
    if analysis.sentiment.polarity > 0:
        return 1  # 正面
    elif analysis.sentiment.polarity == 0:
        return 0  # 中性
    else:
        return -1  # 负面

而且在clean_tweet里最好也加个判断,确保传入的tweet是字符串类型,避免遇到非文本数据时崩溃。

完整的示例代码

把这些调整整合起来,完整的代码大概是这样:

# 筛选目标子集并重置索引
OC = df[df["text"].str.contains("Obamacare", case=False)].reset_index(drop=True)

from textblob import TextBlob
import re

def clean_tweet(tweet):
    if not isinstance(tweet, str):
        return ""
    # 正则清洗文本
    return " ".join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)", " ", tweet).split())

def analize_sentiment(tweet):
    cleaned_tweet = clean_tweet(tweet)
    if not cleaned_tweet:
        return 0
    analysis = TextBlob(cleaned_tweet)
    polarity = analysis.sentiment.polarity
    if polarity > 0:
        return 1
    elif polarity == 0:
        return 0
    else:
        return -1

# 批量给OC添加情感标签
OC["sentiment"] = OC["text"].apply(analize_sentiment)

# 测试单个文本的情感分析
if len(OC) > 0:
    print("第一条文本的情感结果:", analize_sentiment(OC["text"][0]))
else:
    print("没有找到包含Obamacare的文本")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:34:32