前言:
Pandas 的基本特性之一就是高性能的内存式数据连接(join)与合并(merge)操作。pd.merge() 函数实现了三种数据连接的类型:一对一、多对一和多对多。这三种数据连接 类型都通过 pd.merge() 接口进行调用,根据不同的数据连接需求进行不同的操作。
一、数据连接的类型
1.一对一连接
一对一连接是最简单的数据合并类型。
df1= pd.DataFrame({'员工': ['Bob', 'Jake', 'Lisa', 'Sue'], '组': ['Accounting', 'Engineering', 'Engineering', 'HR']})df2= pd.DataFrame({'员工': ['Lisa', 'Bob', 'Jake', 'Sue'], '入职': [2004, 2008, 2012, 2014]})
上次讲解了怎么用concat函数合并成一个DataFrame,下面使用pd.merge函数实现。
df3= pd.merge(df1, df2)df3
代码结果:
pd.merge() 方法会发现两个 DataFrame 都有“员工”这一列,并会自动以这列作为键进行连接。两个输入的合并结果是一个新的 DataFrame。需要注意的是共同列的位置可以是不一致的。
2. 多对一连接
多对一连接是指,在需要连接的两个列中,有一列的值有重复。通过多对一连接获得的结果 DataFrame 将会保留重复值。
df4= pd.DataFrame({'组': ['Accounting', 'Engineering', 'HR'], '管理组': ['Carly', 'Guido', 'Steve']})pd.merge(df1,df4)
代码结果:
在结果 DataFrame 中多了一个“管理组”列,里面有些值会因为输入数据的对应关系而有所重复。
3. 多对多连接
多对多连接是个有点儿复杂的概念,如果左右两个输入的共同列都包含重复值,那么合并的结果就是一种多对多连接。
df5= pd.DataFrame({'组': ['Accounting', 'Accounting', 'Engineering', 'Engineering', 'HR', 'HR'], '技能': ['math', 'spreadsheets', 'coding', 'linux', 'spreadsheets', 'organization']})pd.merge(df1, df5)
代码结果:
这三种数据连接类型可以直接与其他 Pandas 工具组合使用,从而实现各种各样的功能。但是工作中的真实数据集往往并不像示例中演示的那么干净、整洁。
二、设置数据合并的键
1.参数on的用法
最简单的方法就是直接将参数 on 设置为一个列名字符串或者一个包含多列名称的列表。
pd.merge(df1, df2, on='员工')
代码结果:
这个参数只能在两个 DataFrame 有共同列名的时候才可以使用。
2.left_on与right_on参数
有时候要合并两个列名不同的数据集,就可以用 left_on 和 right_on 参数来指定列名。
df7= pd.DataFrame({'名字': ['Bob', 'Jake', 'Lisa', 'Sue'], '薪水': [70000, 80000, 120000, 90000]})pd.merge(df1, df7, left_on="员工