Pandas的基本特性之一就是高性能的内存式数据链接(join)和合并(merge)操做。pd.merge()实现的功能基于关系代数的一部分。关系代数是处理关系型数据的通用理论,巨大部分数据库的可用操做都以此为理论基础。Pandas的pd.merge()方法与Series和DataFrame的join()方法就是基于这些关系代数对应的基本操做规则。python
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
对两个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指定,可选的值有: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')
对于须要合并的两个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