pandas - 分组加权条形图

6
考虑以下由10行组成的DataFrame。
d = {
    'grp_id':[1,2,1,1,1,3,1,1,4,1],
    'weight':[1,2,1,1,1,3,1,1,4,4],
    'value': [1,2,1,3,2,1,4,1,1,3]
}
df = pd.DataFrame(d)

可以通过加权直方图实现
df['value'].hist(histtype='bar', weights=df['weight'])

一个按grp_id分组的未加权条形图。
df['value'].hist(by=df['grp_id'], histtype='bar')

enter image description here

我希望将两者结合起来,并绘制一个按grp_id分组的加权条形图。
我尝试了以下两种方法,但都没有成功,因为两种方法都出现了ValueError
df['value'].hist(by=df['grp_id'], weights=df['weight'], histtype='bar')
df['value'].hist(by=df['grp_id'], weights='weight', histtype='bar')

数值错误:权重应与x具有相同的形状

我正在使用以下临时解决方案。

fig, axes = plt.subplots(2, 2)
for ax,(idx, grp) in zip(axes.flatten(), df.groupby('grp_id')):
    grp['value'].hist(weights=grp['weight'], histtype='bar', ax=ax)

然而,我想问是否有使用pandas直接完成此操作的方法。

你能给我们提供你的示例所期望的输出吗? - Marios Nikolaou
嗨,生成输出的代码在问题的最后部分给出。实际上,它对应于每个组的子图,每个子图都有一个加权条形图。 - abc
因为我不理解,你是想按grp_id分组并计算weight和value列中的唯一值数量吗? - Marios Nikolaou
1个回答

0

首先,我会创建一个新的数据框来存储加权值:

df['weighted_values'] = df.weight*df.value
df = df.groupby('grp_id')['weighted_values'].sum().to_frame().reset_index()

你可以使用seaborn来美观地绘制最终的条形图:
import seaborn as sns
sns.barplot(x = 'grp_id', y = 'weighted_values', data=df)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接