Python Pandas 合并联接——Merge
文章目录
Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。
1. Pandas 安装
官方推荐的安装方式是通过Anaconda安装,但Anaconda太过庞大,若只是需要Pandas的功能,则可通过PyPi方式安装。
pip install Pandas
2. Pandas 的数据操作
使用pandas前需要先引入pandas,若无特别说明,pd作为Pandas别名的通用写法
import pandas as pd
2.1 作用
- 通过一个或多个键将两个数据集的行连接起来,类似与SQL的join。
- 典型场景:两张包含不同字段的表,但有一个共同的主键,可利用merge将其横向整合到一张表
def merge(
self,
right,
how="inner",
on=None,
left_on=None,
right_on=None,
left_index=False,
right_index=False,
sort=False,
suffixes=("_x", "_y"),
copy=True,
indicator=False,
validate=None,
):
2.2 参数说明
-
self(有时也是left)
:DataFrame或Series对象的名称 -
right
:另一个DataFrame或Series对象的名称 -
how
:确定连接主键的方式,默认为innerMerge 方式 对应SQL的功能 描述 left LEFT OUTER JOIN 仅使用左边DataFrame中的主键 right RIGHT OUTER JOIN 仅使用右边DataFrame中的主键 outer FULL OUTER JOIN 使用左右两边DataFrame中主键的并集 inner INNER JOIN 使用左右两边DataFrame中主键的交集 -
on
:用于显式指定列名(键名),如果该列在两个对象中的列名不一样,则可以通过left_on=None, right_on=None 来分别指定。或者想直接使用行索引作为连接键的话,就将 left_index=False, right_index=False 设为 True -
left_on
:左侧DataFrame或Series中的列或索引用作键。可以是列名,索引名称,也可以是长度等于DataFrame或Series长度的数组。 -
right_on
:来自右侧DataFrame或Series的列或索引用作键。可以是列名,索引名称,也可以是长度等于DataFrame或Series长度的数组 -
left_index
:IfTrue
,使用左侧DataFrame或Series中的索引(行标签)作为其连接键。对于具有MultiIndex(分层)的DataFrame或Series,级别数必须与右侧DataFrame或Series中的连接键数相匹配。 -
right_index
:与left_index
右侧DataFrame或Series 相同的用法 -
sort
:按字典顺序通过连接键对结果DataFrame进行排序。默认为True
,设置为False
在很多情况下会显著提高性能 -
suffixes
:要应用于重叠列的字符串后缀元组。默认为('_x', '_y')
-
copy
:始终为True
,从传递的DataFrame或Series对象复制数据(默认),即使不需要重建索引也是如此。 -
indicator
:向输出的DataFrame添加一列,其中_merge
包含有关每行源的信息。_merge
是分类类型,并且left_only
对于其合并键仅出现在'left'
DataFrame或Series中right_only
的观察值,对于其合并键仅出现在DataFrame或Series中的观察值'right'
,以及both
在两者中都找到观察的合并键的观察值。 -
validate
:string,默认无。如果指定,则检查merge是否为指定类型。- “one_to_one”或“1:1”:检查合并键是否在左右数据集中都是唯一的。
- “one_to_many”或“1:m”:检查合并键是否在左数据集中是唯一的。
- “many_to_one”或“m:1”:检查合并键是否在右侧数据集中是唯一的。
- “many_to_many”或“m:m”:允许,但不会导致检查。
2.3 单主键实例说明
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']})
result = pd.merge(left, right, on='key') # 当key确定明显时,可不指定on参数
2.4 多主键实例说明
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
result = pd.merge(left, right, how='left', on=['key1', 'key2'])
Tips:
how=‘left’
以左边主键为标准,在右边寻找相同的主键的一行与左边的行合并作为新的行
result = pd.merge(left, right, how='right', on=['key1', 'key2'])
Tips:
how=‘right’
以右边主键为标准,在左边边寻找相同的主键的一行与右边的行合并作为新的行
result = pd.merge(left, right, how='outer', on=['key1', 'key2'])
Tips:
how=‘outer’
以左右两边主键并集为标准,寻找对应行,作为新行,若出现没有元素的地方,以NaN填充
result = pd.merge(left, right, how='inner', on=['key1', 'key2'])
Tips:
how=‘inner’
以左右两边主键交集为标准,寻找对应行,作为新行
2.5 未作为合并参考主键的列名出现重复
left = pd.DataFrame({'A': [1, 2], 'B': [2, 2]})
right = pd.DataFrame({'A': [4, 5, 6], 'B': [2, 2, 2]})
result = pd.merge(left, right, on='B', how='outer')
默认在重复列名后添加后缀’_x’,’_y’作为新的列名,此后缀可通过suffixes
参数进行设置
Warring:
在重复键上加入/合并可能导致返回的帧是行维度的乘法,这可能导致内存溢出。在加入大型DataFrame之前,用户有责任管理密钥中的重复值
为了避免合并键中出现意外的重复,需要在合并操作之前检查密钥唯一性,防止内存溢出,可设置validate
参数
left = pd.DataFrame({'A' : [1,2], 'B' : [1, 2]})
right = pd.DataFrame({'A' : [4,5,6], 'B': [2, 2, 2]})
result = pd.merge(left, right, on='B', how='outer', validate="one_to_one")
此时会出现MergeError: Merge keys are not unique in right dataset; not a one-to-one merge
原因是参数中设置了validate参数为“one-to-one”,即检查合并键是否在左右数据集中都是唯一的,但在右边数据集中,合并键中出现了重复。但此时左边数据集合并键中没有重复,可设置为validate="one_to_many
,或者为validate="many_to_many
,设置为many_to_many
将不会检查合并键数据集的唯一性。
2.6 提示合并详情
设置indicator
为True(默认为False),将在合并后的数据集中添加一列,列名为“_merge”,数据集提示数据的来源,有以下三种结果
_merge 值 | 含义 |
---|---|
left_only | 该行数据全只来自于左边数据集 |
right_only | 该行数据全只来自于右边数据集 |
both | 该行数据来自于左右两边数据集 |
indicator
也可输入字符串,若如此,视为indicator
的值已经设为True,且设置添加的提示列的列名为输入字符串
参考
[Pnadas用户指南] https://www.pypandas.cn/docs/user_guide/merging.html