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的功能 描述
    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: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章