2015-11-11 3 views
0

Пусть dataframe x:Как объединить две панды DataFrames по объекту CategoricalIndex

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 

Мой вопрос в том, как объединить x и y и получить следующий результат?

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']' имеет больше признаков того, что 'y' может содержать, поэтому я думаю, что поэтому вы не могли получить доступ к фрейму данных' y' с такими индексами: 'In [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] '] не в индексе "' –

Смежные вопросы