合并数据集:连接(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