对数据集筛选子集执行情感分析时触发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
相关产品推荐
相关产品推荐

