1. 程式人生 > 程式設計 >DataFrame 資料合併實現(merge,join,concat)

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

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 資料合併內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!