子图上的平均值图(大熊猫)

时间:2016-08-24 07:20:31

标签: python pandas matplotlib plot

我设法从一个群体中绘制子图。我有两列'A'和'B',我想在子图上绘制(每个值在'B'中为1)及其各自的平均值。 我通过计算,丢弃重复项,然后总结它来准备我的数据(如果有更优雅的方式,请告诉我!)。

df = pd.DataFrame([[1, 'cat1'], [1, 'cat1'], [4, 'cat2'], [3, 'cat1'], [5, 'cat1'],[1, 'cat2']], columns=['A', 'B'])
df = df[['A','B']]
df['count'] = df.groupby(['A','B'])['A'].transform('count')
df = df.drop_duplicates(['A','B'])
df = df.groupby(['A','B']).sum()

然后我将其拆开并用子图绘制它:

plot = df.unstack().plot(kind='bar',subplots=True, sharex=True, sharey=True, layout = (3,3), legend=False)
plt.show(block=True)

我想为每个类别添加均值,但我不知道: 1.如何计算平均值。如果我在未堆叠的groupby上计算它,我得到计数​​的平均值,而不是值'A'。 2.一旦我得到平均值,我就不知道如何在同一个子图上绘制它。

欢迎任何帮助:)

-

根据Nickil Maveli的回答编辑: 我想要实现的是在A上绘制分组值的条形图,并在B上绘制具有平均值的垂直线。因此,使用来自Nickil Maveli的图形,这将是:enter image description here

从我在stackexchange上发现的内容来看,我认为我应该使用plt.axvline(mean, color='r', linestyle='--')。但是,我不知道如何调用每个情节都有不同的平均值。

1 个答案:

答案 0 :(得分:0)

IIUC,您可以在平均值上使用agg并计算预先计算平均值和计数。

df_1 = df.groupby(['A', 'B'])['A'].agg({'counts': 'count'}).reset_index()
df_2 = df.groupby('B')['A'].agg({'average': 'mean'}).reset_index()

在B列后面跟DF.merge,因为它是groupby操作中的公共列。然后,可以删除列A和B之间的重复条目。

df = df_1.merge(df_2, on='B').drop_duplicates(['A', 'B'])
df.drop('average', axis=1, inplace=True)
df = df.groupby(['A','B']).sum()

对第二个数据框进行修改,让A列取平均值。

df_2['A'] = df_2['average']
df_2 = df_2.groupby(['A','B']).sum()

使用布局和定位多个轴。

fig, ax = plt.subplots(2, 2, figsize=(8, 8))

target1 = [ax[0][0], ax[0][1]]
target2 = [ax[1][0], ax[1][1]]

按照情节计数。

df.unstack().plot(kind='bar', subplots=True, rot=0, xlim=(0,5), ax=target1,
                            ylim=(0,3), layout=(2,2), legend=False)

平均分组图。

df_2.unstack().plot(kind='bar', width=0.005, subplots=True, rot=0, xlim=(0,5), ax=target2,
                    ylim=(0,3), layout=(2,2), legend=False, color='k')

调整子图之间的间距。

plt.subplots_adjust(wspace=0.5, hspace=0.5)
plt.show()

Image