Pandas学习笔记六——合并数据集:连接(join)和合并(merge)操作

63 篇文章 6 订阅
39 篇文章 0 订阅

合并数据集:连接(join)和合并(merge)操作

Pandas的基本特性之一就是高性能的内存式数据连接(join)和合并(merge)操作。pd.merge()实现的功能基于关系代数的一部分。关系代数是处理关系型数据的通用理论,巨大部分数据库的可用操作都以此为理论基础。Pandas的pd.merge()方法与Series和DataFrame的join()方法就是基于这些关系代数对应的基本操作规则。

Series和DataFrame的join()方法应用
import numpy as np
import pandas as pd

#创建DataFrame
data1 = pd.DataFrame(np.random.randint(0,10,(3,2)),columns=['a', 'b'])
data2 = pd.DataFrame(np.random.randint(0,10,(3,2)),columns=['c', 'd'])
#按照index对data1和data2进行连接操作,按照需求可以设定lsuffix和rsuffix来对data1和data2中重名的列名进行后缀拓展
print(data1);print(data2);print(data1.join(data2))

#输出如下:
   a  b
0  6  7
1  2  0
2  3  1
   c  d
0  7  3
1  1  5
2  5  9
   a  b  c  d
0  6  7  7  3
1  2  0  1  5
2  3  1  5  9
Pandas.merge()方法的应用
三种连接类型

对两个DataFrame,data1和data2进行merge操作,默认的调用形式是pd.merge(data1, data2)。merge()函数实现了三种数据连接的类型:一对一多对一多对多,这三种类型都通过pd.merge()接口进行调用,根据不同的数据连接需求进行不同的操作。

  • 一对一:

    pd.merge()方法会自动寻找两个DataFrame中相同的列,并自动以这列作为键进行排列。需要注意的是,共同列中元素的位置可以是不一致的,pd.merge()方法能够自动选中相同的行进行连接。另外,pd.merge()默认会丢弃原来的索引,重新生成索引。

    
    #df1
    
    employee        group
    0      Bob   Accounting
    1     Jake  Engineering
    2     Lisa  Engineering
    3      Sue           HR
    
    
    #df2
    
    employee  hire_date
    0     Lisa       2004
    1      Bob       2008
    2     Jake       2012
    3      Sue       2014
    
    
    #pd.merge(df1,df2)
    
    employee        group  hire_date
    0      Bob   Accounting       2008
    1     Jake  Engineering       2012
    2     Lisa  Engineering       2004
    3      Sue           HR       2014
  • 多对一:

    多对一连接是指,在需要连接的两个列中,有一列的值有重复。通过多对一连接获得的结果DataFrame将会保留重复值

    
    #df3:
    
    employee        group  hire_date
    0      Bob   Accounting       2008
    1     Jake  Engineering       2012
    2     Lisa  Engineering       2004
    3      Sue           HR       2014
    
    
    #df4:
    
           group supervisor
    0   Accounting      Carly
    1  Engineering      Guido
    2           HR      Steve
    
    
    #pd.merge(df3,df4)
    
    employee        group  hire_date supervisor
    0      Bob   Accounting       2008      Carly
    1     Jake  Engineering       2012      Guido
    2     Lisa  Engineering       2004      Guido
    3      Sue           HR       2014      Steve
  • 多对多:

    多对多连接可以理解为:如果左右两个输入的共同列都包含重复值,那么合并的结果就是一种多对多连接

    
    #df1
    
    employee        group
    0      Bob   Accounting
    1     Jake  Engineering
    2     Lisa  Engineering
    3      Sue           HR
    
    
    #df5
    
           group        skills
    0   Accounting          math
    1   Accounting  spreadsheets
    2  Engineering        coding
    3  Engineering         linux
    4           HR  spreadsheets
    5           HR  organization
    
    
    #pd.merge(df1,df5)
    
    employee        group        skills
    0      Bob   Accounting          math
    1      Bob   Accounting  spreadsheets
    2     Jake  Engineering        coding
    3     Jake  Engineering         linux
    4     Lisa  Engineering        coding
    5     Lisa  Engineering         linux
    6      Sue           HR  spreadsheets
    7      Sue           HR  organization
设置数据合并的键
  • 参数on的用法

    
    #对于两个DataFrame,假如想要指定employee列作为合并的键,可以通过设置on参数来实现
    
    pd.merge(df1, df2, on='employee')
  • left_on和right_on参数

    
    #有时需要合并两个列名不同的数据集,例如df1数据集中’employee‘和df2中的’name‘现实中的意义相同,只是列名不同,实际上这两列是可以合并的,可以设置left_on和right_on参数来实现需求
    
    pd.merge(df1,df2,left='employee',right_on='name')
  • 参数left_index和right_index

    
    #除了合并列之外有时候还需要合并索引,可以通过设置pd.merge()中的left_index和right_index参数将索引设置为键来实现合并,这其实和pd.join()方法作用一样。
    
    pd.merge(df1,df2, left_index=True, right_index=True)
设置数据连接的集合操作规则(参数how)

当一个值出现在一列,却没有出现在另一列是,就需要考虑集合操作规则,其由参数how指定,可选的值有:inner(默认)、outer、left、right

#参数how=inner表示内连接,这种连接方式得到的结果中只会保留合并的两列元素的交集
pd.merge(df1, df2, how='inner')
#参数how=outer表示外连接,这种连接方式得到的结果是需要合并的两列的并集,所有缺失值都用NaN填充
pd.merge(df1, df2, how='outer')
#参数how=left表示左连接,返回的结果只包含左列
pd.merge(df1, df2, how ='left')
#参数how=right表示左连接,返回的结果只包含右列
pd.merge(df1, df2, how ='right')
重复列名的解决方案:suffixes参数

对于需要合并的两个DataFrame,除了指定合并的键之外可能还存在重名列的情况,如果不对重名列进行处理,得到结果只会保留重名列的并集,这显然会丢失大量的信息。我们可以通过设置suffixes参数来解决这个问题

df8 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],
                    'rank': [1, 2, 3, 4]})
df9 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],
                    'rank': [3, 1, 4, 2]})
pd.merge(df8, df9, on='name', how='left', suffixes=['_L', '_R'])

#输出结果:
   name  rank_L  rank_R
0   Bob       1       1
1  Jake       2       3
2  Lisa       3       4
3   Sue       4       2
  • 12
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值