如何通过CategoricalIndex对象合并两只大熊猫DataFrames
假设一个数据帧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
我的问题是如何合并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
但我很好奇是否有更好的方法来做到这一点。
非常感谢!
你可以不喜欢在answer,但它几乎与您的解决方案:
z = pd.merge(x,y.reset_index(),how='left',on='A_level').set_index(x.index)
谢谢安东。但我仍然好奇是否有像我第一次尝试'x ['B_mean'] = y [x ['A_level']]''的解决方案。 –
'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]']不在索引“'中 –
的可能的复制[如何使用熊猫时,以保持指数合并(http://stackoverflow.com/questions/11976503/how-to-keep-index-when-using-pandas-merge) –