1. 程式人生 > 其它 >pandas之合併操作

pandas之合併操作

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,然後對它們進行合併操作:

  1. import pandas as pd
  2. left = pd.DataFrame({
  3. 'id':[1,2,3,4],
  4. 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
  5. 'subject_id':['sub1','sub2','sub4','sub6']})
  6. right = pd.DataFrame({
  7. 'id':[1,2,3,4],
  8. 'Name': ['William', 'Albert', 'Tony', 'Allen'],
  9. 'subject_id':['sub2','sub4','sub3','sub6']})
  10. print (left)
  11. 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 進行合併操作:

  1. import pandas as pd
  2. left = pd.DataFrame({
  3. 'id':[1,2,3,4],
  4. 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
  5. 'subject_id':['sub1','sub2','sub4','sub6']})
  6. right = pd.DataFrame({
  7. 'id':[1,2,3,4],
  8. 'Name': ['William', 'Albert', 'Tony', 'Allen'],
  9. 'subject_id':['sub2','sub4','sub3','sub6']})
  10. #通過on引數指定合併的鍵
  11. 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 物件:

  1. import pandas as pd
  2. left = pd.DataFrame({
  3. 'id':[1,2,3,4],
  4. 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
  5. 'subject_id':['sub1','sub2','sub4','sub6']})
  6. right = pd.DataFrame({
  7. 'id':[1,2,3,4],
  8. 'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],
  9. 'subject_id':['sub2','sub4','sub3','sub6']})
  10. 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

  1. import pandas as pd
  2. left = pd.DataFrame({
  3. 'id':[1,2,3,4],
  4. 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
  5. 'subject_id':['sub1','sub2','sub4','sub6']})
  6. right = pd.DataFrame({
  7. 'id':[1,2,3,4],
  8. 'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],
  9. 'subject_id':['sub2','sub4','sub3','sub6']})
  10. #以left側的subject_id為鍵
  11. 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

  1. import pandas as pd
  2. left = pd.DataFrame({
  3. 'id':[1,2,3,4],
  4. 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
  5. 'subject_id':['sub1','sub2','sub4','sub6']})
  6. right = pd.DataFrame({
  7. 'id':[1,2,3,4],
  8. 'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],
  9. 'subject_id':['sub2','sub4','sub3','sub6']})
  10. #以right側的subject_id為鍵
  11. 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(並集)

  1. import pandas as pd
  2. left = pd.DataFrame({
  3. 'id':[1,2,3,4],
  4. 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
  5. 'subject_id':['sub1','sub2','sub4','sub6']})
  6. right = pd.DataFrame({
  7. 'id':[1,2,3,4],
  8. 'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],
  9. 'subject_id':['sub2','sub4','sub3','sub6']})
  10. #求出兩個subject_id的並集,並作為鍵
  11. 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(交集)

  1. import pandas as pd
  2. left = pd.DataFrame({
  3. 'id':[1,2,3,4],
  4. 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
  5. 'subject_id':['sub1','sub2','sub4','sub6']})
  6. right = pd.DataFrame({
  7. 'id':[1,2,3,4],
  8. 'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],
  9. 'subject_id':['sub2','sub4','sub3','sub6']})
  10. #求出兩個subject_id的交集,並將結果作為鍵
  11. 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)。