上一篇文章中提到的merge函数,也就是类似于SQL的join方法中,主要的参数是on参数;
除了on参数,还有专门针对index join的参数:index;
可以理解成是左边的一列和右边的索引进行连接,想了想,R中应该是data.table有这种便利的函数,其实我更喜欢直接用SQLDF包;
书中的例子是:
left1=DataFrame({'key':['a','b','a','a','b','c'],
'value':range(6)})
right1=DataFrame({'group_val':[3.5,7]},index=['a','b'])
这两个数据框如下:
left1
key value
0 a 0
1 b 1
2 a 2
3 a 3
4 b 4
5 c 5
right1
group_val
a 3.5
b 7.0
可以看到下面的right1 的index 是 a和b;
那么:
pd.merge(left1,right1,
left_on='key',
right_index=True,
how='outer')
这个函数就是针对left1和right1两个数据框进行合并,join的连接键是左边是key这一列,而右边的看到不用on,而是right_index这个参数,结果为
key value group_val
0 a 0 3.5
2 a 2 3.5
3 a 3 3.5
1 b 1 7.0
4 b 4 7.0
5 c 5 NaN
其实就是外连接,外连接会产生笛卡尔积,所以每一个a,即使在right数据框中没有也会对应一个重复的值,当然c就是NA了。
left2=DataFrame({'key':['a','b','a','a','b','c'],
'value':range(6),
'data':np.random.randn(6)})
right2=DataFrame({'group_val':[3.5,7]},
index=[['a','b'],[0,0]])
pd.merge(left2,right2,
left_on=['key','value'],
right_index=True,
how='inner')
修正一下这两个数据框,添加两个index在right2中,然后再次合并,发现结果为:
data key value group_val
0 -0.771492 a 0 3.5
也就是通过key,value作为连接键,然后左边连得是data,右边连得是index对应的那一行,
顺便说一句,在索引中,数字一定要是数字形式;比如:
right2=DataFrame({'group_val':[3.5,7]},
index=[['a','b'],[0,0]])
这样是能连接上的,但是如果:
right2=DataFrame({'group_val':[3.5,7]},
index=[['a','b'],['0','0']])
这样的话,0会被默认认为是字符,无法进行连接。