首页 > 解决方案 > 如何为groupby结果的每个值绘制条形图,并计算pandas中每组中另一列中不同值的计数

问题描述

我有一个数据框如下:

在此处输入图像描述

我想按 Ngram 分组。然后在每组中,会有不同的 DocFreq 值 - 2, 3, 4..etc。我想要每个组中每个不同的 DocFreq 值的计数。例如,图像中有 7 个三元组。在这7个中,

1 trigram has docFreq = 7
1 trigram has docFreq = 4
1 trigram has docFreq = 3
4 trigrams have docFreq = 2

我想要一个三元组的条形图,它将 x 轴作为 docFreq 值,将 y 轴作为具有该文档频率的三元组的数量。(每个 ngram 的此类条形图)

在另一个stackoverflow答案的帮助下,我完成了以下操作:

dfu = df.groupby(['Ngram']).DocFreq.value_counts().unstack()

这产生下表:

在此处输入图像描述

我想为每个 n-gram 制作单独的条形图。所以基本上这张表中的每一行都应该是一个图,其中 docFreq 是 x 轴,值是每个条的高度。但我不知道如何从这张表中创建这些单独的条形图。或者是否尝试从该表创建,或者是否有任何方法我可以使用主数据框和 groupby 和 value_counts 并制作条形图。

请帮忙。

标签: pandaspandas-groupbybar-chart

解决方案


我以粗略的方式取得了结果。

x = df.loc[(df['Ngram']==3) & (df['DocFreq'] > 1), ['Term', 'DocFreq', 'Ngram']]
xt = x.groupby(['DocFreq']).size()
ax = xt.iloc[:30].plot.bar(figsize = (40,30),rot = 0, )
ax.set_xlabel("Document Frequency")
ax.set_ylabel("Count of documents having the 'DocFreq' number of duplicates")

这给了我一个三元组的条形图,产生以下内容: 在此处输入图像描述 我只取到 30,因为如果我取整个长度,那么条形图就会变得混乱。因此,现在我将分别对所有 n-gram 执行此操作。希望有人能想出一种更快的方法来更高效、更漂亮地生成所有 n-gram 的图。

谢谢你。


推荐阅读