如何按id统计对应Sentiment的出现频率并添加至DataFrame
解决按ID分组统计Sentiment出现频率的问题
你的核心需求是按每个id分组,统计该id下对应Sentiment值的出现次数,但之前的代码都是全局统计Sentiment的频次,没有结合id分组,所以结果不符合预期。
正确解决方案
使用groupby同时按id和Sentiment分组,再用transform将计数结果映射回原DataFrame的每一行:
import pandas as pd from pandas import DataFrame # 你的示例数据 data = {'id': ['205', '205', '204', '204', '204'], 'First_name': ['Jon','Bill','Maria','Emma', 'Bee'], 'Sentiment': ['Positive', 'Positive', 'Neutral', 'Positive', 'Positve']} df = DataFrame(data) # 生成sent_freq列 df['sent_freq'] = df.groupby(['id', 'Sentiment'])['id'].transform('count')
运行后得到的结果:
id First_name Sentiment sent_freq 0 205 Jon Positive 2 1 205 Bill Positive 2 2 204 Maria Neutral 1 3 204 Emma Positive 1 4 204 Bee Positve 1
(注:你提供的"正确结果"中id204的Positive和Positve频次为2,应该是把Positve当成了Positive的拼写错误,若需要修正拼写后统计,可以先执行df['Sentiment'] = df['Sentiment'].replace('Positve', 'Positive')再运行上述代码)
错误原因分析
- 你尝试的第一个循环代码:每次都全局计算
Sentiment.value_counts(),得到的是整个数据集里每种Sentiment的总次数,而非按id分组的次数。 - 第二个代码:仅按
Sentiment分组统计id数量,同样是全局统计,没有结合id维度拆分。
另一种实现方式(merge法)
先计算分组计数,再合并回原DataFrame:
# 计算每个id+Sentiment组合的频次 counts = df.groupby(['id', 'Sentiment']).size().reset_index(name='sent_freq') # 合并到原数据 df = df.merge(counts, on=['id', 'Sentiment'], how='left')
内容的提问来源于stack exchange,提问作者Abir
相关产品推荐
相关产品推荐

