DataFrame 資料合併實現(merge,join,concat)
阿新 • • 發佈:2020-06-15
merge
merge 函式通過一個或多個鍵將資料集的行連線起來。
場景:針對同一個主鍵存在的兩張包含不同特徵的表,通過主鍵的連結,將兩張表進行合併。合併之後,兩張表的行數不增加,列數是兩張表的列數之和。
def merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=False,suffixes=('_x','_y'),copy=True,indicator=False,validate=None):
引數 | 描述 |
---|---|
how | 資料融合的方法,從在不重合的鍵,方式(inner、outer、left、right) |
on | 用來對齊的列名,一定要保證左表和右表存在相同的列名。 |
left_on | 左表對齊的列,可以是列名。也可以是DataFrame同長度的arrays |
right_on | 右表對齊的列,可以是列名。 |
left_index | 將左表的index用作連線鍵 |
right_index | 將右表的index用作連線鍵 |
suffixes | 左右物件中存在重名列,結果區分的方式,字尾名。 |
copy | 預設:True。將資料複製到資料結構中,設定為False提高效能。 |
特性示例(1)
預設:以重疊的列名當作連線鍵
df1 = pd.DataFrame({'key': ['one','two','two'],'data1': np.arange(3)}) df2 = pd.DataFrame({'key': ['one','three','three'],'data2': np.arange(3)}) df3 = pd.merge(df1,df2) print(df1) print(df2) print(df3)
key data1 0 one 0 1 two 1 2 two 2 key data2 0 one 0 1 three 1 2 three 2 key data1 data2 0 one 0 0
特性示例(2)
預設:做inner連線,取key的交集
連線方式還有left right outer
df1 = pd.DataFrame({'key': ['one',df2) df4 = pd.merge(df1,df2,how='left') print(df3) print(df4)
key data1 data2 0 one 0 0 key data1 data2 0 one 0 0.0 1 two 1 NaN 2 two 2 NaN
特性示例(3)
多鍵連線時將連線鍵做成列表傳入。
on預設是兩者同時存在的列
df1 = pd.DataFrame({'key': ['one','value': ['a','b','c'],'c','data2': np.arange(3)}) df5 = pd.merge(df1,df2) df6 = pd.merge(df1,on=['key','value'],how='outer') print(df5) print(df6)
key value data1 data2 0 one a 0 0 1 two c 2 1 key value data1 data2 0 one a 0.0 0.0 1 two b 1.0 NaN 2 two c 2.0 1.0 3 three c NaN 2.0
特性示例(4)
兩個物件的列名不同,需要分別制定。
df7 = pd.merge(df1,left_on=['key1','data1'],right_on=['key2','data2'],how='outer') print(df7)
key1 value_x data1 key2 value_y data2 0 one a 0.0 one a 0.0 1 two b 1.0 two c 1.0 2 two c 2.0 NaN NaN NaN 3 NaN NaN NaN three c 2.0
join
join方法將兩個DataFrame中不同的列索引合併成為一個DataFrame
引數的意義與merge基本相同,只是join方法預設左外連線how=left
def join(self,other,how='left',lsuffix='',rsuffix='',sort=False):
示例
df1 = pd.DataFrame({'A': ['A0','A1','A1'],'B': ['B0','B1','B2']},index=['K0','K1','K2']) df2 = pd.DataFrame({'C': ['C1','C2','C3'],'D': ['D0','D1','D2']},'K3']) df3 = df1.join(df2) df4 = df1.join(df2,how='outer') df5 = df1.join(df2,how='inner') print(df3) print(df4) print(df5)
A B C D K0 A0 B0 C1 D0 K1 A1 B1 C2 D1 K2 A1 B2 NaN NaN A B C D K0 A0 B0 C1 D0 K1 A1 B1 C2 D1 K2 A1 B2 NaN NaN K3 NaN NaN C3 D2 A B C D K0 A0 B0 C1 D0 K1 A1 B1 C2 D1
concat
制定按某個軸進行連線(可橫向可縱向),也可以指定連線方法。
def concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verify_integrity=False,sort=None,copy=True):
屬性 | 描述 |
---|---|
objs | 合併的物件集合。可以是Series、DataFrame |
axis | 合併方法。預設0,表示縱向,1橫向 |
join | 預設outer並集,inner交集。只有這兩種 |
join_axes | 按哪些物件的索引儲存 |
ignore_index | 預設Fasle忽略。是否忽略原index |
keys | 為原始DataFrame新增一個鍵,預設無 |
示例(1)
s1 = pd.Series(['a','b']) s2 = pd.Series(['c','d']) s3 = pd.concat([s1,s2]) s4 = pd.concat([s1,s2],ignore_index=True) print(s3) print(s4)
0 a 1 b dtype: object 0 c 1 d dtype: object 0 a 1 b 0 c 1 d dtype: object 0 a 1 b 2 c 3 d dtype: object
示例(2)
df1 = pd.DataFrame([['a',1],['b',2]],columns=['A',0]) df2 = pd.DataFrame([['a',columns=['B',0]) df3 = pd.concat([df1,df2],join='inner') print(df3)
0 0 1 1 2 0 1 1 2
示例(3)
df1 = pd.DataFrame([['a',axis=1,join_axes=[df1.index]) print(df3)
A 0 B 0 0 a 1 a 1 1 b 2 b 2
append
橫向和縱向同時擴充,不考慮columns和index
df1 = pd.DataFrame({'A': ['A0','K2']) s2 = pd.Series(['X0','X1'],index=['A','B']) result = df1.append(s2,ignore_index=True) print(result)
A B K0 A0 B0 K1 A1 B1 K2 A1 B2 A B 0 A0 B0 1 A1 B1 2 A1 B2 3 X0 X1
彙總
- concat:可以沿一條軸將多個物件連線到一起
- merge:可以根據一個或多個鍵將不同的DataFrame中的行連線起來。
- join:inner是交集,outer是並集。
到此這篇關於DataFrame 資料合併實現(merge,join,concat)的文章就介紹到這了,更多相關DataFrame 資料合併內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!