首頁 > 軟體

Pandas實現兩個表的連線功能的方法詳解

2022-09-02 18:02:43

上次介紹了pandas的多條件篩選,這些都是一些資料處理的必要技能,也不貪多,咱們每次學習一點。

這次咱們說說pandas的兩個表的連線技能merge,也就是根據一個表的條件去匹配另一個表的內容。

話不多說,直接正文。

準備資料

先匯入模組

import pandas as pd

df1 = pd.DataFrame({
    '姓名': ['張三', '李四', '王五', '劉六', '齊四'],
    '號碼': ['123', '456', '789', '987', '654']
})

df2 = pd.DataFrame({
    '姓名': ['張三', '張三', '張三', '李四', '李四', '李四', '李四', '王五', '王五', '劉玉', '胡軍', '劉玉', '劉六', '劉六', '劉六', '劉六', '劉克', '劉玉', '齊七', '齊七', '齊七', '齊七', '馮亮', '劉玉', '王雲'],

    '號碼': ['123', '123', '123', '123', '123', '456', '456', '456', '456', '456', '741', '741', '741', '741', '741', '789', '789', '789', '789', '789', '852', '852', '852', '852', '852'],

    '日期': ['2022-03-13', '2022-03-06', '2022-01-30', '2022-01-04', '2022-02-26', '2022-03-26', '2022-03-06', '2022-01-30', '2022-01-29', '2022-03-13', '2022-03-06', '2022-02-19', '2022-02-04', '2022-03-10', '2022-04-19', '2022-03-10', '2022-01-29', '2022-02-19', '2022-03-06', '2022-03-26', '2022-01-04', '2022-02-04', '2022-04-19', '2022-02-26', '2022-03-06'],

    '方案': ['G1012', 'G1022', 'G1002', 'G1007', 'G1017', 'G1023', 'G1018', 'G1003', 'G1008', 'G1013', 'G1020', 'G1015', 'G1010', 'G1005', 'G1025', 'G1004', 'G1009', 'G1014', 'G1019', 'G1024', 'G1006', 'G1011', 'G1026', 'G1016', 'G1021']
})

輸出內容

df1內容

   姓名   號碼
0  張三  123
1  李四  456
2  王五  789
3  劉六  987
4  齊四  654

df2內容:

    姓名  號碼    日期      方案
0   張三  123  2022-03-13  G1012
1   張三  123  2022-03-06  G1022
2   張三  123  2022-01-30  G1002
3   李四  123  2022-01-04  G1007
4   李四  123  2022-02-26  G1017
5   李四  456  2022-03-26  G1023
6   李四  456  2022-03-06  G1018
7   王五  456  2022-01-30  G1003
8   王五  456  2022-01-29  G1008
9   劉玉  456  2022-03-13  G1013
10  胡軍  741  2022-03-06  G1020
11  劉玉  741  2022-02-19  G1015
12  劉六  741  2022-02-04  G1010
13  劉六  741  2022-03-10  G1005
14  劉六  741  2022-04-19  G1025
15  劉六  789  2022-03-10  G1004
16  劉克  789  2022-01-29  G1009
17  劉玉  789  2022-02-19  G1014
18  齊七  789  2022-03-06  G1019
19  齊七  789  2022-03-26  G1024
20  齊七  852  2022-01-04  G1006
21  齊七  852  2022-02-04  G1011
22  馮亮  852  2022-04-19  G1026
23  劉玉  852  2022-02-26  G1016
24  王雲  852  2022-03-06  G1021

連線

函數說明:pd.merge(left=df1(需要匹配的原始表), right=df2(被匹配的資料表), on="姓名"(需要匹配的條件列), how="inner"(連線方式))

內連線

how預設為inner:內連線查詢特點是df1有匹配的才顯示,不匹配的不顯示

df = pd.merge(left=df1, right=df2, on="姓名", how="inner")

輸出:

    姓名 號碼_x 號碼_y  日期     方案
0   張三  123  123  2022-03-13  G1012
1   張三  123  123  2022-03-06  G1022
2   張三  123  123  2022-01-30  G1002
3   李四  456  123  2022-01-04  G1007
4   李四  456  123  2022-02-26  G1017
5   李四  456  456  2022-03-26  G1023
6   李四  456  456  2022-03-06  G1018
7   王五  789  456  2022-01-30  G1003
8   王五  789  456  2022-01-29  G1008
9   劉六  987  741  2022-02-04  G1010
10  劉六  987  741  2022-03-10  G1005
11  劉六  987  741  2022-04-19  G1025
12  劉六  987  789  2022-03-10  G1004

df1表裡需要匹配的姓名裡,在df2裡面能匹配上姓名的都會列出來,而匹配不上的,都不會列出來,包括df1裡面的內容

小提示:如果兩表有相同列名的,會自動在列名後面加_x,_y來區分

外連線

how="outer"為外連線:查詢特點是無論匹不匹配都顯示,對應的值沒有則顯示空

df = pd.merge(left=df1, right=df2, on="姓名", how="outer")

輸出:

    姓名 號碼_x 號碼_y   日期     方案
0   張三  123  123  2022-03-13  G1012
1   張三  123  123  2022-03-06  G1022
2   張三  123  123  2022-01-30  G1002
3   李四  456  123  2022-01-04  G1007
4   李四  456  123  2022-02-26  G1017
5   李四  456  456  2022-03-26  G1023
6   李四  456  456  2022-03-06  G1018
7   王五  789  456  2022-01-30  G1003
8   王五  789  456  2022-01-29  G1008
9   劉六  987  741  2022-02-04  G1010
10  劉六  987  741  2022-03-10  G1005
11  劉六  987  741  2022-04-19  G1025
12  劉六  987  789  2022-03-10  G1004
13  齊四  654  NaN         NaN    NaN
14  劉玉  NaN  456  2022-03-13  G1013
15  劉玉  NaN  741  2022-02-19  G1015
16  劉玉  NaN  789  2022-02-19  G1014
17  劉玉  NaN  852  2022-02-26  G1016
18  胡軍  NaN  741  2022-03-06  G1020
19  劉克  NaN  789  2022-01-29  G1009
20  齊七  NaN  789  2022-03-06  G1019
21  齊七  NaN  789  2022-03-26  G1024
22  齊七  NaN  852  2022-01-04  G1006
23  齊七  NaN  852  2022-02-04  G1011
24  馮亮  NaN  852  2022-04-19  G1026
25  王雲  NaN  852  2022-03-06  G1021

df1表裡索引13裡的齊四無匹配,是空值,而在df2裡面的內容都會列出來,和df1匹配不上的其它列的內容也是空值

注意:這有點互相匹配的意思喲

左連線

how="left"為左連線:查詢表示左邊的值全部顯示,如右邊無匹配則顯示空。但是右邊有的值匹配不了左邊則不顯示

df = pd.merge(left=df1, right=df2, on="姓名", how="outer")

輸出:

    姓名 號碼_x 號碼_y   日期     方案
0   張三  123  123  2022-03-13  G1012
1   張三  123  123  2022-03-06  G1022
2   張三  123  123  2022-01-30  G1002
3   李四  456  123  2022-01-04  G1007
4   李四  456  123  2022-02-26  G1017
5   李四  456  456  2022-03-26  G1023
6   李四  456  456  2022-03-06  G1018
7   王五  789  456  2022-01-30  G1003
8   王五  789  456  2022-01-29  G1008
9   劉六  987  741  2022-02-04  G1010
10  劉六  987  741  2022-03-10  G1005
11  劉六  987  741  2022-04-19  G1025
12  劉六  987  789  2022-03-10  G1004
13  齊四  654  NaN         NaN    NaN

df1表裡索引13裡的齊四還是無匹配,是空值,而在df2裡面的內容就不會列出來了

右連線

how="right"為右連線:與左連線相反

df = pd.merge(left=df1, right=df2, on="姓名", how="right")

輸出:

    姓名 號碼_x 號碼_y          日期     方案
0   張三  123  123  2022-03-13  G1012
1   張三  123  123  2022-03-06  G1022
2   張三  123  123  2022-01-30  G1002
3   李四  456  123  2022-01-04  G1007
4   李四  456  123  2022-02-26  G1017
5   李四  456  456  2022-03-26  G1023
6   李四  456  456  2022-03-06  G1018
7   王五  789  456  2022-01-30  G1003
8   王五  789  456  2022-01-29  G1008
9   劉玉  NaN  456  2022-03-13  G1013
10  胡軍  NaN  741  2022-03-06  G1020
11  劉玉  NaN  741  2022-02-19  G1015
12  劉六  987  741  2022-02-04  G1010
13  劉六  987  741  2022-03-10  G1005
14  劉六  987  741  2022-04-19  G1025
15  劉六  987  789  2022-03-10  G1004
16  劉克  NaN  789  2022-01-29  G1009
17  劉玉  NaN  789  2022-02-19  G1014
18  齊七  NaN  789  2022-03-06  G1019
19  齊七  NaN  789  2022-03-26  G1024
20  齊七  NaN  852  2022-01-04  G1006
21  齊七  NaN  852  2022-02-04  G1011
22  馮亮  NaN  852  2022-04-19  G1026
23  劉玉  NaN  852  2022-02-26  G1016
24  王雲  NaN  852  2022-03-06  G1021

右連線正好與左連線相反,df1裡面匹配不上的不顯示,df2裡面的內容全都出來了,匹配不上df1的其它列值則為空值

PS這完全是反向匹配呀

到此這篇關於Pandas實現兩個表的連線功能的方法詳解的文章就介紹到這了,更多相關Pandas表的連線內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com