Python Pandas 合并联接——Merge

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:确定连接主键的方式,默认为inner

    Merge 方式对应SQL的功能描述
    leftLEFT OUTER JOIN仅使用左边DataFrame中的主键
    rightRIGHT OUTER JOIN仅使用右边DataFrame中的主键
    outerFULL OUTER JOIN使用左右两边DataFrame中主键的并集
    innerINNER 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:If True,使用左侧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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值