基于DataFrame中sentiment列条件提取count列值报错求助
首先,咱们先理清楚你的需求:从包含hashtag、sentiment和count的DataFrame里,把不同sentiment对应的count值分别收集成元组,对吧?你给出的原始数据和期望结果都很明确,但你的代码里有几个问题导致了那个ValueError,咱们一步步来解决。
先说说你遇到的报错原因
你写的代码里,if car_df['sentiment'] == 'positive'这一行是对整个Series做比较,返回的是一个布尔值组成的Series(每一行对应True/False)。但Python的if条件需要单个布尔值,Pandas不知道你是要判断所有行都满足,还是只要有一行满足,所以就抛出了"The truth value of a Series is ambiguous"的错误。另外你还用到了未定义的row变量,而且每次循环都会覆盖sent_pos这些变量,最后只能得到最后一个符合条件的值,根本收集不到所有数据。
最简洁的解决方案:布尔索引直接提取
Pandas最擅长向量式操作,完全不用写循环,几行代码就能搞定:
# 筛选sentiment为positive的行,提取count列并转成元组 sent_pos = tuple(car_df[car_df['sentiment'] == 'positive']['count']) # 同理处理negative和neutral sent_neg = tuple(car_df[car_df['sentiment'] == 'negative']['count']) sent_neutral = tuple(car_df[car_df['sentiment'] == 'neutral']['count'])
运行这段代码后,sent_pos就是(786, 1126, 910),sent_neg就是(116, 237, 200),完全符合你的期望结果。
更灵活的方案:用groupby分组
如果以后你的sentiment类别变多,重复写筛选条件太麻烦,用groupby会更高效:
# 按sentiment分组,把每个组的count转成元组,再转成字典 sentiment_counts = car_df.groupby('sentiment')['count'].apply(tuple).to_dict() # 从字典里取出对应的值 sent_pos = sentiment_counts['positive'] sent_neg = sentiment_counts['negative'] sent_neutral = sentiment_counts['neutral']
这种方法扩展性更好,不管新增多少种sentiment,都不用修改代码。
如果你想了解循环的正确写法(不推荐,效率低)
如果只是想搞清楚循环怎么写才对,那你需要正确遍历每一行,并且用列表来收集数据:
# 先初始化空列表用来收集数据 sent_pos = [] sent_neg = [] sent_neutral = [] # iterrows返回的是(索引, 行数据),所以要拆成两个变量 for idx, row in car_df.iterrows(): # 用当前行的sentiment来判断 if row['sentiment'] == 'positive': sent_pos.append(row['count']) elif row['sentiment'] == 'negative': sent_neg.append(row['count']) else: sent_neutral.append(row['count']) # 最后把列表转成元组 sent_pos = tuple(sent_pos) sent_neg = tuple(sent_neg) sent_neutral = tuple(sent_neutral)
不过要注意,在处理大数据集的时候,iterrows的效率远不如前面两种向量式操作,所以尽量优先用前两种方法。
内容的提问来源于stack exchange,提问作者girlrilaz

