簡體   English   中英

子圖上的平均值(熊貓)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM