基于Pandas GroupBy绘制段落情感统计柱状图的实现问题求助
解决DataFrame情感标签柱状图绘制问题
我来帮你搞定这个柱状图的问题!你的核心需求是按每个original_data(段落)统计不同情感标签的数量,然后用柱状图展示对吧?之前的代码没达到效果,是因为没有先对情感标签的数量做统计,直接分组plot是行不通的,咱们一步步来:
步骤1:先做数据聚合统计
首先得把每个段落里的Anger和Sadness数量统计出来,用groupby结合size()来计数,再用unstack()把情感标签转成列,方便后续绘图:
import pandas as pd import matplotlib.pyplot as plt # 你的示例数据 d = {'text': ["aaa", "aaa", "bbb", "aaa", "bbb", "bbb"], 'start': [0, 1, 0, 2, 1, 0], 'end': [250, 500, 501, 251, 249, 499], 'label': ["anger", "sadness", "sadness", "sadness", "anger", "anger"], 'annotator': [0,1,1,1,0,0], 'original_data': ["aaaaaa", "bbbbbb", "aaaaaa", "bbbbbb", "aaaaaa", "bbbbbb"], 'speaker': ["Achiles", "Hektor", "Achiles", "Achiles", "Hektor", "Hektor"], 'rounded_length': [110, 250, 250, 110, 110, 250]} df = pd.DataFrame(data=d) # 按original_data和label分组,统计每组的条目数 count_df = df.groupby(['original_data', 'label']).size().unstack(fill_value=0)
运行这段代码后,count_df会变成清晰的统计结构:
| original_data | anger | sadness |
|---|---|---|
| aaaaaa | 2 | 1 |
| bbbbbb | 1 | 2 |
步骤2:绘制柱状图
现在直接用plot.bar()就能生成你要的柱状图,每个段落对应Anger和Sadness两个柱子:
# 绘制柱状图 count_df.plot(kind='bar', figsize=(8, 6), rot=0) # 添加图表装饰,让结果更直观 plt.title('Emotion Count per Original Paragraph', fontsize=12) plt.xlabel('Original Paragraph', fontsize=10) plt.ylabel('Number of Entries', fontsize=10) plt.legend(title='Emotion Label', bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
为什么之前的代码不行?
你之前的groupby(['original_data', 'rounded_length']).plot(y='label', x='rounded_length')存在两个核心问题:
- 分组维度不对:你要的是按
original_data和label统计数量,而不是rounded_length - 直接plot分类变量:
label是字符串类型的分类变量,不能直接作为y轴绘制,必须先统计每个类别的数量
这样调整后就能完美实现你要的效果啦!
内容的提问来源于stack exchange,提问作者GDelavy
相关产品推荐
相关产品推荐

