You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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:设置行索引为Sentiment
  • columns:设置列为Role
  • aggfunc='size':用于计数
  • fill_value=0:填充空值为0

以上三种方法均可得到你期望的输出格式。

内容的提问来源于stack exchange,提问作者datashout

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:55:17