[英]Plot average on subplots (pandas)
我設法從groupby繪制子圖。 我有兩列“ 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的圖形,這將是:
根據我在plt.axvline(mean, color='r', linestyle='--')
上發現的信息,我認為我應該使用plt.axvline(mean, color='r', linestyle='--')
。 但是,我不知道每個情節的平均值如何。
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.