2015-11-11 114 views
0

假設一個數據幀x如何通過CategoricalIndex對象合併兩隻大熊貓DataFrames

x = pd.DataFrame({'A':[None,None,3,4,5,6,7,8,9,10],'B':[2,4,3,5,1,6,9,0,4,4]},index = range(10,20)) 
bins = [0,3,6,15] 
x['A_level'] = pd.cut(x['A'],bins) 
print x 

它看起來像:

 A B A_level 
10 NaN 2 NaN 
11 NaN 4 NaN 
12 3 3 (0, 3] 
13 4 5 (3, 6] 
14 5 1 (3, 6] 
15 6 6 (3, 6] 
16 7 9 (6, 15] 
17 8 0 (6, 15] 
18 9 4 (6, 15] 
19 10 4 (6, 15] 

然後彙總系列y寫着:

y = x[['A_level','B']].groupby('A_level').mean() 
y.columns = ['B_mean'] 
print y 

這看起來像:

  B 
A_level  
(0, 3] 3.00 
(3, 6] 4.00 
(6, 15] 4.25 

我的問題是如何合併xy並得到如下結果?

A B A_level B_mean 
10 NaN 2 NaN NaN 
11 NaN 4 NaN NaN 
12 3 3 (0, 3] 3.00 
13 4 5 (3, 6] 4.00 
14 5 1 (3, 6] 4.00 
15 6 6 (3, 6] 4.00 
16 7 9 (6, 15] 4.25 
17 8 0 (6, 15] 4.25 
18 9 4 (6, 15] 4.25 
19 10 4 (6, 15] 4.25 

我已經試過

x['B_mean'] = y[x['A_level']] 

但它返回KeyError

下面的代碼可以做類似的工作,

z = pd.merge(x,y.reset_index(),how='left',on='A_level') 

返回:

A B A_level B_mean 
0 NaN 2  NaN  NaN 
1 NaN 4  NaN  NaN 
2 3 3 (0, 3] 3.00 
3 4 5 (3, 6] 4.00 
4 5 1 (3, 6] 4.00 
5 6 6 (3, 6] 4.00 
6 7 9 (6, 15] 4.25 
7 8 0 (6, 15] 4.25 
8 9 4 (6, 15] 4.25 
9 10 4 (6, 15] 4.25 

x指數和z是不同的。我知道這可以通過

z.index = x.index 

但我很好奇是否有更好的方法來做到這一點。

非常感謝!

+0

的可能的複製[如何使用熊貓時,以保持指數合併(http://stackoverflow.com/questions/11976503/how-to-keep-index-when-using-pandas-merge) –

回答

0

你可以不喜歡在answer,但它幾乎與您的解決方案:

z = pd.merge(x,y.reset_index(),how='left',on='A_level').set_index(x.index) 
+0

謝謝安東。但我仍然好奇是否有像我第一次嘗試'x ['B_mean'] = y [x ['A_level']]''的解決方案。 –

+0

'X [ 'A_level']'有更多indicesthat'y'可能含有,所以我想這就是爲什麼你不能與索引訪問'y'數據框: '在[40]:Y [X [ 'A_level'] ]' 'KeyError:「[nan nan'(0,3]''(3,6]''(3,6]''(3,6]''(6,15)''(6,15 ]''(6,15]'\ n'(6,15]']不在索引「'中 –