如何在Pandas分组操作中展示列标签并统计角色情感频次
问题描述
我有一个包含Sentiment和Role列的DataFrame,数据如下:
Sentiment Role positive manager positive worker negative leader positive director negative leader positive manager negative manager
我希望按Sentiment分组,统计每种情感标签下各Role出现的次数,期望输出如下:
期望输出
worker leader director manager positive 1 0 1 2 negative 0 2 0 1
我尝试使用代码:
df.groupby('Sentiment').agg({'Role':'count'})
但结果缺失了各Role的标签,请问该如何实现?
解决方案
你需要用交叉表或分组透视的方式实现需求,之前的groupby+agg(count)仅能统计每个情感下的总条数,无法拆分出各Role的独立计数。
方法1:使用pd.crosstab(最简洁)
这是专门用于计算两列频率交叉表的方法,会自动补全缺失组合为0:
import pandas as pd # 假设你的DataFrame为df result = pd.crosstab(df['Sentiment'], df['Role']) print(result)
方法2:groupby配合value_counts+unstack
如果偏好groupby逻辑,可先统计分组内Role的频次,再将行索引转为列并填充空值:
result = df.groupby('Sentiment')['Role'].value_counts().unstack(fill_value=0) print(result)
value_counts():统计每个情感分组内各Role的出现次数unstack():将Role从行索引转换为列fill_value=0:确保未出现的Role显示为0而非NaN
方法3:使用pivot_table
通过透视表指定行、列、聚合规则实现:
result = df.pivot_table(index='Sentiment', columns='Role', aggfunc='size', fill_value=0) print(result)
index:设置行索引为Sentimentcolumns:设置列为Roleaggfunc='size':用于计数fill_value=0:填充空值为0
以上三种方法均可得到你期望的输出格式。
内容的提问来源于stack exchange,提问作者datashout
相关产品推荐
相关产品推荐

