[英]How to plot aggregate results after groupby in Pandas?
我最近開始學習 Pandas,但在使用groupby和agg后如何繪制結果時遇到了一些麻煩。 使用 Pandas,我創建了一個數據框,並根據兩列“ID”和“x”對其進行分組。 然后我從組中選擇了一個特定的列(“結果”)來計算 sem 和平均值。
具體來說,代碼:
df = pd.read_csv('pandas_2015-11-7.csv')
df_group = df.groupby(['x','ID'])['results']
df_group_results = df_group.agg([stats.sem, np.mean])
結果如下所示:
sem mean
x ID
2.5 0 0.010606 0.226674
1 0.000369 0.490820
2 0.000508 0.494094
5.0 0 0.001672 0.005059
1 0.012252 0.190962
2 0.003696 0.170342
7.5 0 0.001630 0.004506
1 0.002567 0.016109
2 0.002081 0.047301
10.0 0 0.000000 0.000000
1 0.000000 0.000000
2 0.000000 0.000000
12.5 0 0.000000 0.000000
1 0.000000 0.000000
2 0.000000 0.000000
我的問題是如何根據這些結果制作帶有誤差線的線圖? x 軸應基於 'x' 值,而 'ID' 確定行(在本例中為 3 行,圖例分別為 0、1 和 2)。 我想要實現的理想情節是這樣的
(來源: matplotlib.org )
.
groupby() 方法返回一個分層索引(多索引):
http://pandas.pydata.org/pandas-docs/stable/advanced.html
如果我創建一個具有類似分層索引的 df:
import pandas as pd
df = pd.DataFrame({'mean':[0.5,0.25,0.7,0.8],'sem':[0.1,0.1,0.1,0.2]})
df.index = pd.MultiIndex(levels=[[2.5,5.0],[0,1]],labels=[[0,0,1,1],[0,1,0,1]],names=['x','ID'])
然后我有以下df:
mean sem
x ID
2.5 0 0.50 0.1
1 0.25 0.1
5.0 0 0.70 0.1
1 0.80 0.2
我可以從多索引中獲取相關信息,並使用它來按順序選擇和繪制正確的行:
x_values = df.index.levels[0]
ID_values = df.index.levels[1]
for ID in ID_values:
mean_data = df.loc[[(x,ID) for x in x_values],'mean'].tolist()
error_data = df.loc[[(x,ID) for x in x_values],'sem'].tolist()
matplotlib.pyplot.errorbar(x_values,mean_data,yerr=error_data)
legend(ID_values)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.