4-Pandas數據預處理之數據融合(pd.merge()、df.join()、df.combine_first()詳解)


一、pd.merge()

pd.merge()的常用參數
參數 說明
left 參與合並的左側DataFrame
right 參與合並的右側DataFrame
how

如何合並。值為{'left','right','outer','inner'},默認為'inner'

left: 僅保留左側DataFrame中存在的鍵

right:僅保留右側DataFrame中存在的鍵

outer:保留左右DataFrame鍵的交集

inner:保留左右DataFrame鍵的並集

on 用於連接的列名,默認是兩個DataFrame重疊的列
left_on 左側DataFrame中用作連接鍵的列
right_on 右側DataFrame中用作連接鍵的列
left_index {True,False},將左側的行索引用作其連接鍵
right_index {True,False},將右側的行做引用作其連接鍵
suffixes 字符串值元組,用於追加到重疊列名的后綴,默認為('_x','_y')

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(1)先創建兩個DataFrame

>>> left = pd.DataFrame({'姓名':['張某','李某','段某'],'年齡':[22,26,24]})
>>> left
   姓名  年齡
0  張某  22
1  李某  26
2  段某  24

>>> right = pd.DataFrame({'姓名':['張某','李某','錢某'],'籍貫':['北京','河北','江蘇']})
>>> right
   姓名  籍貫
0  張某  北京
1  李某  河北
2  錢某  江蘇

(2)在默認情況下,將重疊列當做鍵,也可通過參數on指定;

>>> pd.merge(left,right)
   姓名  年齡  籍貫
0  張某  22  北京
1  李某  26  河北

#通過參數on指定
>>> pd.merge(left,right,on='姓名')
   姓名  年齡  籍貫
0  張某  22  北京
1  李某  26  河北

(3)融合指標變量indicator,設置indicator的值為True,則融合結果中將增加列名為"_merge"的一列,其值代表不同含義:

取值 說明
left_only 融合的鍵僅在左側的DataFrame中存在
right_only 融合的鍵僅在右側的DataFrame中存在
both 融合的鍵左右兩側的DataFrame中均存在

 

 

 

 

>>> pd.merge(left,right,on='姓名',how='outer',indicator=True)
   姓名    年齡   籍貫      _merge
0  張某  22.0   北京        both
1  李某  26.0   河北        both
2  段某  24.0  NaN   left_only
3  錢某   NaN   江蘇  right_only

  indicator也可以接受字符串,生成的指標列的列名將由”_merge“變為該字符串:

>>> pd.merge(left,right,on='姓名',how='outer',indicator='indicator_column')
   姓名    年齡   籍貫 indicator_column
0  張某  22.0   北京             both
1  李某  26.0   河北             both
2  段某  24.0  NaN        left_only
3  錢某   NaN   江蘇       right_only

(4)索引與列進行融合

注:left的索引和right中的某一列均為“姓名”,現在需要根據姓名進行融合

>>> left = pd.DataFrame({'年齡':[22,26,24]},index=['張某','李某','段某'])
>>> left
    年齡
張某  22
李某  26
段某  24
>>> left.index.name='姓名'
>>> left
    年齡
姓名
張某  22
李某  26
段某  24

>>> right = pd.DataFrame({'姓名':['張某','李某','錢某'],'籍貫':['北京','河北','江蘇']})
>>> right
   姓名  籍貫
0  張某  北京
1  李某  河北
2  錢某  江蘇


#其中,left的索引和right中的某一列均為“姓名”,現在需要根據姓名進行融合
>>> pd.merge(left,right,how='outer',left_index=True,right_on='姓名')
     年齡  姓名   籍貫
0  22.0  張某   北京
1  26.0  李某   河北
2  24.0  段某  NaN
2   NaN  錢某   江蘇

 (5)索引與索引的融合

left和right的索引均為‘姓名’,現進行融合

>>> left = pd.DataFrame({'年齡':[22,26,24]},index=['張某','李某','段某'])
>>> left.index.name='姓名'
>>> right = pd.DataFrame({'籍貫':['北京','河北','江蘇']},index=['張某','李某','錢某'])
>>> right.index.name='姓名'
>>> left
    年齡
姓名
張某  22
李某  26
段某  24
>>> right
    籍貫
姓名
張某  北京
李某  河北
錢某  江蘇

#left和right的索引均為‘姓名’,現進行融合
>>> pd.merge(left,right,how='outer',left_index=True,right_index=True)
      年齡   籍貫
姓名
張某  22.0   北京
李某  26.0   河北
段某  24.0  NaN
錢某   NaN   江蘇

二、join()

join()函數相對於pd.merge()而言是一種更為簡便的實現方式

(1)對於索引與列的融合,需要設置on參數,來指明左鍵

注意:此時on的值應該是具體的列,而不是索引,索引此時的實體(即join左邊的對象應該是包含“姓名”列的DataFrame)

>>> left
    年齡
姓名
張某  22
李某  26
段某  24
>>> right
   姓名  籍貫
0  張某  北京
1  李某  河北
2  錢某  江蘇

#注意:此時on的值應該是具體的列,而不是索引,索引此時的實體(即join左邊的對象應該是包含“姓名”列的DataFrame)
>>> right.join(left,on='姓名')
   姓名  籍貫    年齡
0  張某  北京  22.0
1  李某  河北  26.0
2  錢某  江蘇   NaN

 

(2)索引與索引的融合

相當於>>>pd.merge(left,right,how='outer',left_index=True,right_on='姓名')

>>> left
    年齡
姓名
張某  22
李某  26
段某  24
>>> right
    籍貫
姓名
張某  北京
李某  河北
錢某  江蘇

>>> left.join(right,how='outer')
      年齡   籍貫
姓名
張某  22.0   北京
李某  26.0   河北
段某  24.0  NaN
錢某   NaN   江蘇

注意:merge和joiny都有參數sort,當sort=True時表示連接后的結果會按照連接變量進行升序排列。

例:>>>pd.merge(test_user,test_loan,how='outer',left_on='user_id',right_on='user',sort=True)

三、combine_first()

  由於數據融合是有一種常見的現象,即:需要根據一個DataFrame對象中的值為另一個DataFrame中的值做缺失值處理;

於是combine_first()應運而生,該方法實現了用參數對象中的數據為調用者對象的缺失數據“打補丁”,且會自動對其索引。

>>> left = pd.DataFrame({'姓名':['張某','李某','段某'],'年齡':[22,26,24]})
>>> right = pd.DataFrame({'姓名':['張某','李某','段某'],'年齡':[22,np.nan,np.nan],'籍貫':['北京','河北','江蘇']})

#根據left中的值去填補right中的值
>>> right.combine_first(left)
   姓名    年齡  籍貫
0  張某  22.0  北京
1  李某  26.0  河北
2  段某  24.0  江蘇

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM