一、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 江蘇