我设法从一个群体中绘制子图。我有两列'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的图形,这将是:
从我在stackexchange上发现的内容来看,我认为我应该使用plt.axvline(mean, color='r', linestyle='--')
。但是,我不知道如何调用每个情节都有不同的平均值。
答案 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()