pandas之合併操作
阿新 • • 發佈:2021-12-05
Pandas 提供的 merge() 函式能夠進行高效的合併操作,這與 SQL 關係型資料庫的 MERGE 用法非常相似。從字面意思上不難理解,merge 翻譯為“合併”,指的是將兩個 DataFrame 資料表按照指定的規則進行連線,最後拼接成一個新的 DataFrame 資料表。
merge() 函式的法格式如下:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,left_index=False, right_index=False, sort=True,suffixes=('_x', '_y'), copy=True)
引數說明,如下表所示:
引數名稱 | 說明 |
---|---|
left/right | 兩個不同的 DataFrame 物件。 |
on | 指定用於連線的鍵(即列標籤的名字),該鍵必須同時存在於左右兩個 DataFrame 中,如果沒有指定,並且其他引數也未指定, 那麼將會以兩個 DataFrame 的列名交集做為連線鍵。 |
left_on | 指定左側DataFrame 中作連線鍵的列名。該引數在左、右列標籤名不相同,但表達的含義相同時非常有用。 |
right_on | 指定左側 DataFrame 中作連線鍵的列名。 |
left_index | 布林引數,預設為 False。如果為 True 則使用左側 DataFrame 的行索引作為連線鍵,若 DataFrame 具有多層 索引(MultiIndex),則層的數量必須與連線鍵的數量相等。 |
right_index | 布林引數,預設為 False。如果為 True 則使用左側 DataFrame 的行索引作為連線鍵。 |
how | 要執行的合併型別,從{'left', 'right', 'outer', 'inner'} 中取值,預設為“inner”內連線。 |
sort | 布林值引數,預設為True,它會將合併後的資料進行排序;若設定為 False,則按照 how 給定的引數值進行排序。 |
suffixes | 字串組成的元組。當左右 DataFrame 存在相同列名時,通過該引數可以在相同的列名後附加字尾名,預設為('_x','_y')。 |
copy | 預設為 True,表示對資料進行復制。 |
注意:Pandas 庫的 merge() 支援各種內外連線,與其相似的還有 join() 函式(預設為左連線)。
下面建立兩個不同的 DataFrame,然後對它們進行合併操作:
- import pandas as pd
- left = pd.DataFrame({
- 'id':[1,2,3,4],
- 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
- 'subject_id':['sub1','sub2','sub4','sub6']})
- right = pd.DataFrame({
- 'id':[1,2,3,4],
- 'Name': ['William', 'Albert', 'Tony', 'Allen'],
- 'subject_id':['sub2','sub4','sub3','sub6']})
- print (left)
- print (right)
輸出如下:
id Name subject_id 0 1 Smith sub1 1 2 Maiki sub2 2 3 Hunter sub4 3 4 Hilen sub6 id Name subject_id 0 1 William sub2 1 2 Albert sub4 2 3 Tony sub3 3 4 Allen sub6
1) 在單個鍵上進行合併操作
通過 on 引數指定一個連線鍵,然後對上述 DataFrame 進行合併操作:
- import pandas as pd
- left = pd.DataFrame({
- 'id':[1,2,3,4],
- 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
- 'subject_id':['sub1','sub2','sub4','sub6']})
- right = pd.DataFrame({
- 'id':[1,2,3,4],
- 'Name': ['William', 'Albert', 'Tony', 'Allen'],
- 'subject_id':['sub2','sub4','sub3','sub6']})
- #通過on引數指定合併的鍵
- print(pd.merge(left,right,on='id'))
輸出結果:
id Name_x subject_id_x Name_y subject_id_y 0 1 Smith sub1 William sub2 1 2 Maiki sub2 Albert sub4 2 3 Hunter sub4 Tony sub3 3 4 Hilen sub6 Allen sub6
2) 在多個鍵上進行合併操作
下面示例,指定多個鍵來合併上述兩個 DataFrame 物件:
- import pandas as pd
- left = pd.DataFrame({
- 'id':[1,2,3,4],
- 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
- 'subject_id':['sub1','sub2','sub4','sub6']})
- right = pd.DataFrame({
- 'id':[1,2,3,4],
- 'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],
- 'subject_id':['sub2','sub4','sub3','sub6']})
- print(pd.merge(left,right,on=['id','subject_id']))
輸出結果:
id Name_x subject_id Name_y 0 4 Hilen sub6 Mike
使用how引數合併
通過how
引數可以確定 DataFrame 中要包含哪些鍵,如果在左表、右表都不存的鍵,那麼合併後該鍵對應的值為 NaN。為了便於大家學習,我們將 how 引數和與其等價的 SQL 語句做了總結:
Merge方法 | 等效 SQL | 描述 |
---|---|---|
left | LEFT OUTER JOIN | 使用左側物件的key |
right | RIGHT OUTER JOIN | 使用右側物件的key |
outer | FULL OUTER JOIN | 使用左右兩側所有key的並集 |
inner | INNER JOIN | 使用左右兩側key的交集 |
1) left join
- import pandas as pd
- left = pd.DataFrame({
- 'id':[1,2,3,4],
- 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
- 'subject_id':['sub1','sub2','sub4','sub6']})
- right = pd.DataFrame({
- 'id':[1,2,3,4],
- 'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],
- 'subject_id':['sub2','sub4','sub3','sub6']})
- #以left側的subject_id為鍵
- print(pd.merge(left,right,on='subject_id',how="left"))
輸出結果:
id_x Name_x subject_id id_y Name_y 0 1 Smith sub1 NaN NaN 1 2 Maiki sub2 1.0 Bill 2 3 Hunter sub4 2.0 Lucy 3 4 Hilen sub6 4.0 Mike
2) right join
- import pandas as pd
- left = pd.DataFrame({
- 'id':[1,2,3,4],
- 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
- 'subject_id':['sub1','sub2','sub4','sub6']})
- right = pd.DataFrame({
- 'id':[1,2,3,4],
- 'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],
- 'subject_id':['sub2','sub4','sub3','sub6']})
- #以right側的subject_id為鍵
- print(pd.merge(left,right,on='subject_id',how="right"))
輸出結果:
id_x Name_x subject_id id_y Name_y 0 2.0 Maiki sub2 1 Bill 1 3.0 Hunter sub4 2 Lucy 2 4.0 Hilen sub6 4 Mike 3 NaN NaN sub3 3 Jack
3)outer join(並集)
- import pandas as pd
- left = pd.DataFrame({
- 'id':[1,2,3,4],
- 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
- 'subject_id':['sub1','sub2','sub4','sub6']})
- right = pd.DataFrame({
- 'id':[1,2,3,4],
- 'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],
- 'subject_id':['sub2','sub4','sub3','sub6']})
- #求出兩個subject_id的並集,並作為鍵
- print(pd.merge(left,right,on='subject_id',how="outer"))
輸出結果:
id_x Name_x subject_id id_y Name_y 0 1.0 Smith sub1 NaN NaN 1 2.0 Maiki sub2 1.0 Bill 2 3.0 Hunter sub4 2.0 Lucy 3 4.0 Hilen sub6 4.0 Mike 4 NaN NaN sub3 3.0 Jack
4) inner join(交集)
- import pandas as pd
- left = pd.DataFrame({
- 'id':[1,2,3,4],
- 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
- 'subject_id':['sub1','sub2','sub4','sub6']})
- right = pd.DataFrame({
- 'id':[1,2,3,4],
- 'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],
- 'subject_id':['sub2','sub4','sub3','sub6']})
- #求出兩個subject_id的交集,並將結果作為鍵
- print(pd.merge(left,right,on='subject_id',how="inner"))
輸出結果:
id_x Name_x subject_id id_y Name_y 0 2 Maiki sub2 1 Bill 1 3 Hunter sub4 2 Lucy 2 4 Hilen sub6 4 Mike
注意:當 a 與 b 進行內連操作時 a.join(b) 不等於 b.join(a)。