2015-11-08 69 views
1

我最近開始學習熊貓,我在使用groupbyagg後如何繪製結果方面遇到了一些麻煩。使用Pandas,我創建了一個數據框,並根據兩列「ID」和「x」對它進行分組。然後,我從組中選擇一個特定列('結果')來計算sem和mean。如何繪製Pandas中groupby後的聚合結果?

具體來說,代碼:

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)。我想達到的理想情節是這樣的plot http://matplotlib.org/1.2.1/mpl_examples/pylab_examples/errorbar_demo_00.png

回答

2

的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) 
+1

謝謝!這就說得通了。我想指出的一個小錯誤是我認爲你的意思是說(x,ID)而不是(ID,x)。 – kc2uno

+0

謝謝,現在改變了。 – danielstn