Merge

转载地址

合并数据集

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值