使用Pandas从DataFrame列创建列表时出现KeyError: False错误求助
Pandas按列筛选生成列表的问题及解决方法
问题描述
尝试从DataFrame的updated sentiments列筛选对应内容,生成不同情感类别的文本列表时遇到两个问题:
- 初始筛选代码报错
KeyError: False:
positive = tweet_df[tweet_df['updated sentiments'].equals('positive')]
- 后续写的循环代码未按
updated sentiments列的行值区分,无法正确填充列表:
pos_words = [] neg_words = [] net_words = [] for i in range(len(tweet_df['updated sentiments'])): if tweet_df['updated sentiments'].equals('negative'): neg_words.extend(tweet_df['Tweet Body'].tolist()) elif tweet_df['updated sentiments'].equals('positive'): pos_words.extend(tweet_df['Tweet Body'].tolist()) else: net_words.extend(tweet_df['Tweet Body'].tolist())
错误原因
- 初始代码错误:
equals()方法是用来比较整个Series是否与目标对象完全相等,返回单个布尔值(True/False)。而DataFrame的索引需要的是与行数匹配的布尔数组,直接用单个布尔值会被当成列名查找,因此触发KeyError。 - 循环代码错误:循环中每次判断的是整个
updated sentiments列是否等于指定字符串,而非当前行的情感值。因此判断条件要么始终成立要么始终不成立,无法按行区分不同情感的文本。
解决方法
方法1:矢量化筛选(推荐,Pandas原生高效写法)
用==替代equals(),==会对Series的每个元素逐一比较,返回布尔数组,可直接用于索引DataFrame,再提取Tweet Body列转为列表:
# 筛选正情感文本并转为列表 pos_words = tweet_df[tweet_df['updated sentiments'] == 'positive']['Tweet Body'].tolist() # 筛选负情感文本并转为列表 neg_words = tweet_df[tweet_df['updated sentiments'] == 'negative']['Tweet Body'].tolist() # 筛选中性情感文本并转为列表 net_words = tweet_df[tweet_df['updated sentiments'] == 'neutral']['Tweet Body'].tolist()
方法2:修正循环写法(适合理解遍历逻辑)
使用iterrows()遍历DataFrame的每一行,获取当前行的情感值和文本内容,再分类添加到对应列表:
pos_words = [] neg_words = [] net_words = [] for _, row in tweet_df.iterrows(): sentiment = row['updated sentiments'] tweet_body = row['Tweet Body'] if sentiment == 'negative': neg_words.append(tweet_body) elif sentiment == 'positive': pos_words.append(tweet_body) else: net_words.append(tweet_body)
内容的提问来源于stack exchange,提问作者No_Name
相关产品推荐
相关产品推荐

