2014-04-23 152 views
7

我想提請箱線圖以下大熊貓據幀分層柱:箱形圖在python熊貓

> p1.head(10) 

    N0_YLDF MAT 
0  1.29 13.67 
1  2.32 10.67 
2  6.24 11.29 
3  5.34 21.29 
4  6.35 41.67 
5  5.35 91.67 
6  9.32 21.52 
7  6.32 31.52 
8  3.33 13.52 
9  4.56 44.52 

我想箱圖是列「N0_YLDF」的,但他們應該進行分層「墊'。當我使用foll。命令:

p1.boxplot(column='N0_YLDF',by='MAT') 

它使用所有獨特的MAT值,它們在完整的p1數據幀數中大約爲15,000。這導致了一個難以理解的boxplot。

有什麼辦法,我可以分層的MAT值,讓我得到N0_YLDF的不同箱圖的MAT值的第一個四分位數等等....

的感謝!

回答

5

pandas.qcut會給你的分位數,但直方圖般的操作將需要一些numpy弄虛作假非常便利的位置:

_, breaks = np.histogram(df.MAT, bins=5) 
ax = df.boxplot(column='N0_YLDF', by='Class') 
ax.xaxis.set_ticklabels(['%s'%val for i, val in enumerate(breaks) if i in df.Class]) 

enter image description here

數據框現在看起來是這樣的:

N0_YLDF MAT Class 
0  1.29 13.67  1 
1  2.32 10.67  0 
2  6.24 11.29  1 
3  5.34 21.29  1 
4  6.35 41.67  2 
5  5.35 91.67  5 
6  9.32 21.52  1 
7  6.32 31.52  2 
8  3.33 13.52  1 
9  4.56 44.52  3 

[10 rows x 3 columns] 

它也可以用來得到四分位圖:

breaks = np.asarray(np.percentile(df.MAT, [25,50,75,100])) 
df['Class'] = (df.MAT.values > breaks[..., np.newaxis]).sum(0) 
ax = df.boxplot(column='N0_YLDF', by='Class') 
ax.xaxis.set_ticklabels(['%s'%val for val in breaks]) 

enter image description here

+0

這是偉大的,非常感謝你再一次!有什麼方法可以用實際MAT分位數值替換x軸標籤? – user308827

+0

另外,什麼是在休息[...]?謝謝! – user308827

+1

這很簡單,只要使用'breaks'的值,如果圖表返回爲ax;則添加這個'ax.xaxis.set_ticklabels(['%s'%val for i,val in enumerate(breaks)如果我在df.Class])'中,'breaks'包含直方圖的bin邊。 –

8

大熊貓有cutqcut功能,使分層變量,像這樣簡單:

# Just asking for split into 4 equal groups (i.e. quartiles) here, 
# but you can split on custom quantiles by passing in an array 
p1['MAT_quartiles'] = pd.qcut(p1['MAT'], 4, labels=['0-25%', '25-50%', '50-75%', '75-100%']) 
p1.boxplot(column='N0_YLDF', by='MAT_quartiles') 

輸出:

enter image description here

+0

非常感謝你!我將在未來使用更多的qcut ... – user308827

+0

@Marius想要做一個pull請求將它添加到cookbook.rst?請做內聯,這樣圖中的代碼也會顯示出來 - 還包括這個問題的鏈接 - 謝謝 – Jeff

+0

@Jeff:當然,我會盡量在今晚進行討論。我一直想看看是否有任何有用的貢獻可以加入熊貓,這看起來是一個很好的開始。 – Marius