1. 程式人生 > >python pandas 合併資料函式merge join concat combine_first 區分

python pandas 合併資料函式merge join concat combine_first 區分

pandas物件中的資料可以通過一些內建的方法進行合併:pandas.merge,pandas.concat,例項方法join,combine_first,它們的使用物件和效果都是不同的,下面進行區分和比較。

資料的合併可以在列方向和行方向上進行,即下圖所示的兩種方式: 方式裡插入圖片描述

pandas.merge和例項方法join實現的是圖2列之間的連線,以DataFrame資料結構為例講解,DataFrame1和DataFrame2必須要在至少一列上內容有重疊,index也好,columns也好,只要是有內容重疊的列即可,指定其中一列或幾列作為連線的鍵,然後按照鍵,索引DataFrame2其他列上的的資料,新增DataFrame1中。例,以columns內容作為連線鍵: import numpy as np import pandas as pd from pandas import Series,DataFrame df1 = DataFrame({‘key’: [‘b’, ‘b’, ‘a’, ‘c’, ‘a’, ‘a’, ‘b’], ‘data1’: range(7)}) df2 = DataFrame({ ‘key’: [‘a’, ‘b’, ‘d’], ‘data2’: range(3), ‘data3’:range(3,6)}) DF1=pd.merge(df1, df2) 複製程式碼

merge 通過設定merge引數’on’,‘left_on’,'right_on’可以指定用來連線的列(即關鍵的重複內容列),也可以將index作為連線鍵,只要傳入left_index=True或right_index=True(或兩個都傳)來說明索引被用作連線鍵,例:

left1 = DataFrame({‘key’: [‘a’, ‘b’, ‘a’, ‘a’, ‘b’, ‘c’], ‘value’: range(6)}) right1 = DataFrame({‘group_val’: [3.5, 7]}, index=[‘a’, ‘b’]) lr=pd.merge(left1, right1, left_on=‘key’, right_index=True) 在這裡插入圖片描述

而例項方法join預設通過index來進行連線,例:

left2 = DataFrame([[1., 2.], [3., 4.], [5., 6.]], index=[‘a’, ‘c’, ‘e’], columns=[‘Ohio’, ‘Nevada’]) right2 = DataFrame([[7., 8.], [9., 10.], [11., 12.], [13, 14]], index=[‘b’, ‘c’, ‘d’, ‘e’], columns=[‘Missouri’, ‘Alabama’]) lr2=left2.join(right2, how=‘outer’) 在這裡插入圖片描述

join方法也可以通過列來連線,同樣設定引數‘on’即可。

上面介紹的函式實現的均是列之間的連線,要實現行之間的連線,要使用pd.concat方法,例:

s1 = Series([0, 1], index=[‘a’, ‘b’]) s2 = Series([2, 3, 4], index=[‘c’, ‘d’, ‘e’]) s3 = Series([5, 6], index=[‘f’, ‘g’]) ss=pd.concat([s1, s2, s3]) st=pd.concat([s1,s2,s3],axis=1)

在這裡插入圖片描述 concat預設在axis=0上工作(沿著負y軸的方向),當設定axis=1時(沿著x軸的方向),它同時也可以實現列之間的連線,產生一個DataFrame。

最後一個例項方法combine_first,它實現既不是行之間的連線,也不是列之間的連線,它在為資料“打補丁”:用引數物件中的資料為呼叫者物件的缺失資料“打補丁”。例:

複製程式碼 a = Series([np.nan, 2.5, np.nan, 3.5, 4.5, np.nan], index=[‘f’, ‘e’, ‘d’, ‘c’, ‘b’, ‘a’]) b = Series(np.arange(len(a), dtype=np.float64), index=[‘f’, ‘e’, ‘d’, ‘c’, ‘b’, ‘a’]) b[-1] = np.nan c=b[:-2].combine_first(a[2:]) df1 = DataFrame({‘a’: [1., np.nan, 5., np.nan], ‘b’: [np.nan, 2., np.nan, 6.], ‘c’: range(2, 18, 4)}) df2 = DataFrame({‘a’: [5., 4., np.nan, 3., 7.], ‘b’: [np.nan, 3., 4., 6., 8.]}) df=df1.combine_first(df2) 複製程式碼 在這裡插入圖片描述

在這裡插入圖片描述

簡單總結來說,通過merge和join合併的資料後資料的列變多,通過concat合併後的資料行列都可以變多(axis=1),而combine_first可以用一個數據填充另一個數據的缺失資料。

注:以上所有實驗都是預設的“inner”連線方式(交集),可以通過“how”引數改變。