熊猫-分组加权条形图

时间:2019-12-21 18:45:13

标签: python pandas

请考虑以下由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 分组的加权条形图。

我尝试了以下2种方法,但均未成功,因为我都获得了ValueError

df['value'].hist(by=df['grp_id'], weights=df['weight'], histtype='bar')
df['value'].hist(by=df['grp_id'], weights='weight', histtype='bar')
  

ValueError:权重应与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)

但是,我想问问是否有直接的方法可以处理大熊猫。

1 个答案:

答案 0 :(得分: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