- 在最开始,我们先导入常规的 numpy 和 pandas 库。
import numpy as np
import pandas as pd
- 为了方便维护,数据在数据库内都是分表存储的,比如用一个表存储所有用户的基本信息,一个表存储用户的消费情况。
- 所以,在日常的数据处理中,经常需要将两张表拼接起来使用,这样的操作对应到 SQL 中是 join,在 Pandas 中则是用 merge 来实现。这篇文章就讲一下 merge 的主要原理。
- 上面的引入部分说到 merge 是用来拼接两张表的,那么拼接时自然就需要将用户信息一一对应地进行拼接,所以进行拼接的两张表需要有一个共同的识别用户的键(key)。
- 总结来说,整个 merge 的过程就是将信息一一对应匹配的过程,下面介绍 merge 的四种类型,分别为 inner、left、right 和 outer。
一、merge() 函数
pd.merge(left,right,how: str = 'inner',on=None,left_on=None,right_on=None,left_index: bool = False,
right_index: bool = False,sort: bool = False,suffixes=('_x', '_y'),copy: bool = True,indicator: bool = False,validate=None,)
- merge() 函数的参数含义如下:
- left/right 表示两个不同的 DataFrame 对象。
- how 表示要执行的合并类型,从 {‘left’, ‘right’, ‘outer’, ‘inner’} 中取值,默认为 inner 内连接。
- on 表示指定用于连接的键(即列标签的名字),该键必须同时存在于左右两个 DataFrame 中,如果没有指定,并且其他参数也未指定,那么将会以两个 DataFrame 的列名交集做为连接键。
- left_on 表示指定左侧 DataFrame 中作连接键的列名。该参数在左、右列标签名不相同,但表达的含义相同时非常有用。
- right_on 表示指定左侧 DataFrame 中作连接键的列名。
- left_index 为布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键。
- right_index 为布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键。
- sort 为布尔参数,默认为 False,则按照 how 给定的参数值进行排序。设置为 True,它会将合并后的数据进行排序。
- suffixes 表示字符串组成的元组。当左右 DataFrame 存在相同列名时,通过该参数可以在相同的列名后附加后缀名,默认为 (‘x’,‘y’)。
- copy 默认为 True,表示对数据进行复制。
- 这里需要注意的是,Pandas 库的 merge() 支持各种内外连接,与其相似的还有 join() 函数(默认为左连接)。
1. inner
- merge() 的 inner 的类型称为内连接,它在拼接的过程中会取两张表的键(key)的交集进行拼接。
- 下面以图解的方式来一步一步拆解。

- 首先我们有以下的数据,左侧和右侧的数据分别代表了用户的基础信息和消费信息,连接两张表的键是 userid。
- 例如,我们先生成 df_1 的初始数据。
df_1 = pd.DataFrame({
"userid":['a', 'b', 'c', 'd'],
"age":[23, 46, 32, 19]
})
df_1
df_2 = pd.DataFrame({
"userid":['a', 'c'],
"payment":[2000, 3500]
})
df_2
- 使用 merge() 函数对 df_1 和 df_2 进行拼接。由于 df_2 中只有 a 和 c 的参数,因此,合并之后只有 a 和 c。
df_1.merge(df_2,on='userid')
pd.merge(df_1, df_2, on='userid')
- 对于上述过程,我们可以采用如下图片进行解释。
- (1) 取两张表的键的交集,这里 df_1 和 df_2 的 userid 的交集是 {a,c}。



- 相信整个过程并不难理解,上面演示的是同一个键下,两个表对应只有一条数据的情况(一个用户对应一条消费记录)。
- 那么,如果一个用户对应了多条消费记录的话,那又是怎么拼接的呢?
- 假设现在的数据变成了下面这个样子,在 df_2 中,有两条和 a 对应的数据:
- 我们同样用 inner 的方式进行 merge:
df_1 = pd.DataFrame({
"userid":['a', 'b', 'c', 'd'],
"age":[23, 46, 32, 19]
})
df_2 = pd.DataFrame({