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