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

合并数据集:链接(join)和合并(merge)操做

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

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()接口进行调用,根据不一样的数据链接需求进行不一样的操做。linux

  • 一对一:web

    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
  • 多对一:dom

    多对一链接是指,在须要链接的两个列中,有一列的值有重复。经过多对一链接得到的结果DataFrame将会保留重复值svg

    #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的用法ui

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

    #有时须要合并两个列名不一样的数据集,例如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