合并数据集
pandas对象中的数据能够通过一些内置的方式进行合并:
pandas.merge可依据一个或多个键将不同DataFrame中的行连接起来。SQL或其它关系型数据库的用户对此应该会比較熟悉,由于它实现的就是数据库的连接操作。
pandas.concat能够沿着一条轴将多个对象堆叠到一起。
实例方法combine_first能够将反复数据编接在一起,用一个对象中的值填充还有一个对象中的缺失值。
数据库风格的DataFrame合并
数据集的合并(merge)或连接(join)运算是通过一个或多个键将行链接起来的。这些运算是关系型数据库的核心。pandas的merge函数是对数据应用这些算法的主要切入点。
df1=pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
...: 'data1': range(7)})
df2 = pd.DataFrame({'key': ['a', 'b', 'd'],
...: 'data2': range(3)})
print df1
print '------------'
print df2
Output
data1 key
0 0 b
1 1 b
2 2 a
3 3 c
4 4 a
5 5 a
6 6 b
------------
data2 key
0 0 a
1 1 b
2 2 d
merge基本用法
print pd.merge(df1,df2,on='key')
output
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默认为inner内连接
df3 = pd.DataFrame({'lkey': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
'data1': range(7)})
df4 = pd.DataFrame({'rkey': ['a', 'b', 'd'],
'data2': range(3)})
pd.merge(df3,df4,left_on='lkey',right_on='rkey')
output
可能你已经主要到了,结果里面c和d以及与之相关的数据消失了。默认情况下,merge做的是“inner”连接;结果中的键是交集。其它方式还有“left”、“right”以及“outer”。外连接求取的是键的交集,组合了左连接和右连接的效果:
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
外连接
pd.merge(df3,df4,left_on='lkey',right_on='rkey',how='outer')
output
data1 lkey data2 rkey
0 0.0 b 1.0 b
1 1.0 b 1.0 b
2 6.0 b 1.0 b
3 2.0 a 0.0 a
4 4.0 a 0.0 a
5 5.0 a 0.0 a
6 3.0 c NaN NaN
7 NaN NaN 2.0 d
左连接
pd.merge(df3,df4,left_on='lkey',right_on='rkey',how='left')
data1 lkey data2 rkey
0 0 b 1.0 b
1 1 b 1.0 b
2 2 a 0.0 a
3 3 c NaN NaN
4 4 a 0.0 a
5 5 a 0.0 a
6 6 b 1.0 b
右连接
pd.merge(df3,df4,left_on='lkey',right_on='rkey',how='right')
data1 lkey data2 rkey
0 0.0 b 1 b
1 1.0 b 1 b
2 6.0 b 1 b
3 2.0 a 0 a
4 4.0 a 0 a
5 5.0 a 0 a
6 NaN NaN 2 d
多对多连接
df1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'b'],
....: 'data1': range(6)})
df2 = pd.DataFrame({'key': ['a', 'b', 'a', 'b', 'd'],
....: 'data2': range(5)})
print pd.merge(df1,df2)
output
data1 key data2
0 0 b 1
1 0 b 3
2 1 b 1
3 1 b 3
4 5 b 1
5 5 b 3
6 2 a 0
7 2 a 2
8 4 a 0
9 4 a 2
pd.merge(df1, df2, on='key', how='left')
0 0 b 1
1 0 b 3
2 1 b 1
3 1 b 3
4 5 b 1
5 5 b 3
6 2 a 0
7 2 a 2
8 4 a 0
9 4 a 2
10 3 c NaN
依据多个键进行合并,传入一个由列名组成的列表就可以:
警告:
在进行列-列连接时,DataFrame对象中的索引会被丢弃。
对于合并运算须要须要考虑的最后一个问题是对反复列名的处理。尽管你能够手工处理列名重叠的问题,但merge有一个更有用的suffixes选项,用于指定附加到左右两个DataFrame对象的重叠列名上的字符串:
left = pd.DataFrame({'key1': ['foo', 'foo', 'bar'],
....: 'key2': ['one', 'two', 'one'],
....: 'lval': [1, 2, 3]})
right = pd.DataFrame({'key1': ['foo', 'foo', 'bar', 'bar'],
....: 'key2': ['one', 'one', 'one', 'two'],
....: 'rval': [4, 5, 6, 7]})
pd.merge(left, right, on='key1')
key1 key2_x lval key2_y rval
0 foo one 1 one 4
1 foo one 1 one 5
2 foo two 2 one 4
3 foo two 2 one 5
4 bar one 3 one 6
5 bar one 3 two 7
pd.merge(left, right, on=['key1','key2'])
key1 key2 lval rval
0 foo one 1 4
1 foo one 1 5
2 bar one 3 6
自动给予重复列名 新名称
pd.merge(left, right, on='key1', suffixes=('_left', '_right'))
key1 key2_left lval key2_right rval
0 foo one 1 one 4
1 foo one 1 one 5
2 foo two 2 one 4
3 foo two 2 one 5
4 bar one 3 one 6
5 bar one 3 two 7