python 数据合并(merge and concat)

pandas concat & merge 用法

merge 方法

pandas.merge 根据一个或多个键将不同的DataFrame 的行连起来(跟SQL 的连接类似)。
官方文档:pandas.DataFrame.merge
先看例子:

df1 = pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
df2 = pd.DataFrame({'key':['a','b','d'],'data1':range(3)})
df1
   data1 key
0      0   b
1      1   b
2      2   a
3      3   c
4      4   a
5      5   a
df2
   data1 key
0      0   a
1      1   b
2      2   d
pd.merge(df1,df2,on='key')
   data1_x key  data1_y
0        0   b        1
1        1   b        1
2        6   b        1
3        2   a        0
4        4   a        0
5        5   a        0

当两个Dataframe有重复的列时,可以通过on 来指定公共列,也可不指定。建议指定。这merge默认是inner连接,其效果是,不是两个Dataframe共有的,则会被省略(即取交集)其他连接方式还有:left、right、outer
再看列名不同的时候,通过left_onright_on指定列名的例子:

df3= pd.DataFrame({'lkey':['b','b','a','c','a','a','b'],'data1':range(7)})
df4 = pd.DataFrame({'rkey':['a','b','d'],'data1':range(3)})
pd.merge(df3,df4,left_on='lkey',right_on='rkey')
   data1_x lkey  data1_y 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

全连接outer示例:

pd.merge(df1,df2,on='key',how = 'outer')
#不共有的行被赋值NaN
   data1_x key  data1_y
0      0.0   b      1.0
1      1.0   b      1.0
2      6.0   b      1.0
3      2.0   a      0.0
4      4.0   a      0.0
5      5.0   a      0.0
6      3.0   c      NaN
7      NaN   d      2.0

mergesuffixies参数可以指定附加到两个Dataframe对象重叠列名上的字符串。

pd.merge(df1,df2,on='key',how = 'outer',suffixes=('_left_','_right'))
   data1_left_ key  data1_right
0          0.0   b          1.0
1          1.0   b          1.0
2          6.0   b          1.0
3          2.0   a          0.0
4          4.0   a          0.0
5          5.0   a          0.0
6          3.0   c          NaN
7          NaN   d          2.0

left_index和right_index用来标识索引是否作为连接键。在索引需要作为连接键的时候,必须要作相应的标识,否则会报错。

left1= pd.DataFrame({'key':['a','b','a','a','b','c'],'data1':range(6)})
right1 = pd.DataFrame({'group_val':[3.5,7]},index = ['a','b'])
pd.merge(left1,right1,left_on='key',right_index=True)
   data1 key  group_val
0      0   a        3.5
2      2   a        3.5
3      3   a        3.5
1      1   b        7.0
4      4   b        7.0

当出现按索引合并的情形时,Dataframejoin方法能更加方便的实现。

concat

pandas.concat 实现沿着某条轴将多个对象堆叠。也叫作轴向连接。
官方文档:pandas.concat
例子:
三个没有重叠索引的Series,concat可以连接在一起形成新的Series,默认按照axis = 0执行。传入axis = 1,结果变成DataFrame.

s1 = pd.Series([0,1],index=['a','b'])
s2 = pd.Series([2,3,4],index=['c','d','e'])
s3= pd.Series([5,6],index=['f','g'])
pd.concat([s1,s2,s3])
a    0
b    1
c    2
d    3
e    4
f    5
g    6
dtype: int64
pd.concat([s1,s2,s3],axis =1 )
     0    1    2
a  0.0  NaN  NaN
b  1.0  NaN  NaN
c  NaN  2.0  NaN
d  NaN  3.0  NaN
e  NaN  4.0  NaN
f  NaN  NaN  5.0
g  NaN  NaN  6.0

join = 'inner '可以获得交接的拼接。

s4 = pd.concat([s1 * 5,s3])
s4
a    0
b    5
f    5
g    6
dtype: int64
pd.concat([s1,s4],axis=1,join='inner')
   0  1
a  0  0
b  1  5
#join='inner'对axis=0 不起作用。

同样的逻辑对DataFrame一样:

import numpy as np
df1 = pd.DataFrame(np.arange(6).reshape(3,2),index=['a','b','c'],columns=['one','two'])
df2 = pd.DataFrame(5+np.arange(4).reshape(2,2),index=['a','c'],columns=['three','four'])
pd.concat([df1,df2],axis=1,keys=['level1','level2'])
  level1     level2     
     one two  three four
a      0   1    5.0  6.0
b      2   3    NaN  NaN
c      4   5    7.0  8.0
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半九拾

援助一个bug吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值