合并数据集
pandas对象中得数据可以通过一些内置的方式进行合并:
——pandas.merge可根据一个或多个键将不同DataFrame中的行连接起来。SQL或其他关系型数据库的用户对此应该会比较熟悉,因为它实现的就是数据库的连接操作。
——pandas.concat可以沿着一条轴将多个对象堆叠到一起。
——combine_first可以将重复数据编接在一起,用一个对象中的值填充另一个对象中的缺失值。
1、数据库风格的DataFrame合并
(1)数据集的合并(merge)或连接(join)运算是通过一个或多个键将行链接起来的。
df1 = DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
df2 = DataFrame({'key':['a','b','d'],'data2':range(3)})
df1
Out[3]:
key data1
0 b 0
1 b 1
2 a 2
3 c 3
4 a 4
5 a 5
6 b 6
df2
Out[4]:
key data2
0 a 0
1 b 1
2 d 2
(2)这是一种多对一的合并。
df1中的数据有多个被标记为a和b的行,而df2中key列的每个值则仅对应一行。对这些对象调用merge即可得到:
pd.merge(df1,df2) #没有指明用哪个列连接时,merge就会被重叠列的列名当做键。
Out[6]:
key data1 data2
0 b 0 1
1 b 1 1
2 b 6 1
3 a 2 0
4 a 4 0
5 a 5 0
pd.merge(df1,df2,on='key') #最好显式指定一下
Out[7]:
key data1 data2
0 b 0 1
1 b 1 1
2 b 6 1
3 a 2 0
4 a 4 0
5 a 5 0
(3)如果两个对象的列名不同,也可以分别进行指定:
df3 = DataFrame({'1key':['b','b','a','c','a','a','b'],'data1':range(7)})
df4 = DataFrame({'rkey':['a','b','d'],'data2':range(3)})
pd.merge(df3,df4,left_on='1key',right_on='rkey')
Out[11]:
1key data1 rkey data2
0 b 0 b 1
1 b 1 b 1
2 b 6 b 1
3 a 2 a 0
4 a 4 a 0
5 a 5 a 0
(4)默认情况下,merge做的是inner连接,结果中的键是交集。其他方式还有“left”、“right”、“outer”,外连接是并集,组合了左连接和右连接的效果。多对多的合并操作非常简单,无需额外的工作。
df1 = DataFrame({'key':['b','b','a','c','a','b'],'data1':range(6)})
df2 = DataFrame({'key':['a','b','a','b','d'],'data2':range(5)})
df1
Out[13]:
key data1
0 b 0
1 b 1
2 a 2
3 c 3
4 a 4
5 b 5
df2
Out[14]:
key data2
0 a 0
1 b 1
2 a 2
3 b 3
4 d 4
pd.merge(df1,df2,on='key',how='left')
Out[15]:
key data1 data2
0 b 0 1.0
1 b 0 3.0
2 b 1 1.0
3 b 1 3.0
4 a 2 0.0
5 a 2 2.0
6 c 3 NaN
7 a 4 0.0
8 a 4 2.0
9 b 5 1.0
10 b 5 3.0
(5)多对多连接产生的是行的笛卡尔积。由于左边的DataFrame有3个“b”行,右边的有2个,所以最终结果中有6个“b”行。
left = DataFrame({'key1':['foo','foo','bar'],'key2':['one','two','one'],'lval'