歡迎您光臨本站 註冊首頁

DataFrame 資料合併實現(merge,join,concat)

←手機掃碼閱讀     kyec555 @ 2020-06-15 , reply:0

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', 'two', 'two'],            'data1': np.arange(3)})  df2 = pd.DataFrame({'key': ['one', 'three', 'three'],            'data2': np.arange(3)})  df3 = pd.merge(df1, 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', 'two', 'two'],            'value': ['a', 'b', 'c'],            'data1': np.arange(3)})  df2 = pd.DataFrame({'key': ['one', 'two', 'three'],            'value': ['a', 'c', 'c'],            'data2': np.arange(3)})  df5 = pd.merge(df1, df2)  df6 = pd.merge(df1, df2, 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, df2, 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, on=None, 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']},            index=['K0', 'K1', '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', 1], ['b', 2]], 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', 1], ['b', 2]], columns=['A', 0])  df2 = pd.DataFrame([['a', 1], ['b', 2]], columns=['B', 0])  df3 = pd.concat([df1, df2], 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', 'A1', 'A1'],            'B': ['B0', 'B1', 'B2']},            index=['K0', 'K1', '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是並集。



[kyec555 ] DataFrame 資料合併實現(merge,join,concat)已經有229次圍觀

http://coctec.com/docs/program/show-post-238638.html