合并数据集
数据分析和建模方面的大量编程工作都是用在数据准备上的:加载、清理、转换以及重塑。有时候,存放在文件或数据库中的数据并不能满足你的数据处理应用的要求。pandas对象中的数据可以通过一些内置的方式进行合并:
pandas.merge可根据一个或多个键将不同DataFrame中的行连接起来。
数据库风格的DataFrame合并
数据集的合并(merge)或连接(join)运算是通过一个或多个键将行链接起来的。这些运算是关系型数据库的核心。pandas的merge函数是对数据应用这些算法的主要切入点。
In [1]: from pandas import Series,DataFrame
In [2]: import pandas as pd
In [3]: import numpy as np
In [6]: df1=DataFrame({
'key':['b', 'b', 'a', 'c', 'a', 'a', 'b'],
...: 'data1':range(7)})
In [7]: df2=DataFrame({
'key': ['a', 'b', 'd'],'data2':range(3)})
In [8]: df1
Out[8]:
data1 key
0 0 b
1 1 b
2 2 a
3 3 c
4 4 a
5 5 a
6 6 b
In [9]: df2
Out[9]:
data2 key
0 0 a
1 1 b
2 2 d
这是一种多对一的合并。df1中的数据有多个被标记为a和b的行,而df2中key列的每个值则仅对应一行。对这些对象调用merge即可得到
In [10]: pd.merge(df1,df2)
Out[10]:
data1 key data2
0 0 b 1
1 1 b 1
2 6 b 1
3 2 a 0
4 4 a 0
5 5 a 0
并没有指明要用哪个列进行连接。如果没有指定,merge就会将重叠列的列名当做键。不过,最好显式指定一下
In [11]: pd.merge(df1, df2, on='key')
Out[11]:
data1 key data2
0 0 b 1
1 1 b 1
2 6 b 1
3 2 a 0
4 4 a 0
5 5 a 0
如果两个对象的列名不同,也可以分别进行指定
In [12]: df3 = DataFrame({
'lkey': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
...: 'data1': range(7)})
In [13]: df4 = DataFrame({
'rkey': ['a', 'b', 'd'],
...: 'data2': range(3)})
In [14]: df3
Out[14]:
data1 lkey
0 0 b
1 1 b
2 2 a
3 3 c
4 4 a
5 5 a
6 6 b
In [15]: df4
Out[15]:
data2 rkey
0 0 a
1 1 b
2 2 d
In [16]: pd.merge(df3, df4, left_on='lkey', right_on='rkey')
Out[16]:
data1 lkey data2 rkey
0 0 b 1 b
1 1 b 1 b
2 6 b 1 b
3 2 a 0 a
4 4 a 0 a
5 5 a 0 a
已经注意到了,结果里面c和d以及与之相关的数据消失了。默认情况下,merge做的是”inner”连接;结果中的键是交集。其他方式还有”left”、”right”以及”outer”。外连接求取的是键的并集,组合了左连接和右连接的效果
In [17]: pd.merge(df1, df2, how='outer')
Out[