pd.concat/merge/join

pandas的拼接分爲兩種:python

  • 級聯:pd.concat, pd.append
  • 合併:pd.merge, pd.join

一.回顧numpy.concatenate

生成1個6*3的矩陣,一個2*3的矩陣,對其分別進行兩個維度上的級聯app

nd1 = np.random.randint(0,150,size = (6,3))
nd2 = np.random.randint(0,150,size = (2,3))
np.concatenate((nd1,nd2))
np.concatenate([nd1,nd2])

 

二. concat

pandas使用pd.concat函數,與np.concatenate函數相似,只是多了一些參數:dom

參數:函數

pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,keys=None, levels=None, names=None, verify_integrity=False)

參數說明:spa

objs: series,dataframe或者是panel構成的序列lsit 
axis: 須要合併連接的軸,0是行,1是列 ,默認axis=0
join:鏈接的方式 inner,或者outer.net

1.相同字段的表首尾相接

# 現將表構成list,而後在做爲concat的輸入
frames = [df1, df2, df3]
 
result = pd.concat(frames)

要在相接的時候在加上一個層次的key來識別數據源自於哪張表,能夠增長key參數  3d

result = pd.concat(frames, keys=['x', 'y', 'z'])  

效果以下:code

2. 橫向表拼接(行對齊)

有三種級聯方式:blog

  • 外鏈接:補NaN(默認模式)
  • 內鏈接:只鏈接匹配的項
  • 鏈接指定軸:join_axes

(1)axis

當axis = 1的時候,concat就是行對齊,而後將不一樣列名稱的兩張表合併排序

result = pd.concat([df1, df4], axis=1)

(2)join

加上join參數的屬性,若是爲’inner’獲得的是兩表的交集,若是是outer,獲得的是兩表的並集。

result = pd.concat([df1, df4], axis=1, join='inner')

(3)join_axes

若是有join_axes的參數傳入,能夠指定根據那個軸來對齊數據 
例如根據df1表對齊數據,就會保留指定的df1表的軸,而後將df4的表與之拼接

result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])

3. append

append是series和dataframe的方法,使用它就是默認沿着列進行憑藉(axis = 0,列對齊)

result = df1.append(df2)

4. 無視index的concat

若是兩個表的index都沒有實際含義,使用ignore_index參數,置true,合併的兩個表就是根據列字段對齊,而後合併。最後再從新整理一個新的index。 

5. 合併的同時增長區分數據組的鍵

前面提到的keys參數能夠用來給合併後的表增長key來區分不一樣的表數據來源

(1)能夠直接用key參數實現

result = pd.concat(frames, keys=['x', 'y', 'z'])

(2)傳入字典來增長分組鍵

pieces = {'x': df1, 'y': df2, 'z': df3}
result = pd.concat(pieces)

6. 在dataframe中加入新的行

append方法能夠將 series 和 字典的數據做爲dataframe的新一行插入。 

s2 = pd.Series(['X0', 'X1', 'X2', 'X3'], index=['A', 'B', 'C', 'D'])
result = df1.append(s2, ignore_index=True)

7. 表格列字段不一樣的表合併

若是遇到兩張表的列字段原本就不同,但又想將兩個表合併,其中無效的值用nan來表示。那麼可使用ignore_index來實現。

dicts = [{'A': 1, 'B': 2, 'C': 3, 'X': 4}, {'A': 5, 'B': 6, 'C': 7, 'Y': 8}]
result = df1.append(dicts, ignore_index=True)

 

三. merge()

merge的參數

  • on:列名,join用來對齊的那一列的名字,用到這個參數的時候必定要保證左表和右表用來對齊的那一列都有相同的列名。
  • left_on:左表對齊的列,能夠是列名,也能夠是和dataframe一樣長度的arrays。
  • right_on:右表對齊的列,能夠是列名,也能夠是和dataframe一樣長度的arrays。
  • left_index/ right_index: 若是是True的haunted以index做爲對齊的key
  • how:數據融合的方法。
  • sort:根據dataframe合併的keys按字典順序排序,默認是,若是置false能夠提升表現。

merge的默認合併方法:merge用於表內部基於 index-on-index 和 index-on-column(s) 的合併,但默認是基於index來合併。

1. 經過on指定數據合併對齊的列

 

pd.merge(left, right)# 默認merge會將重疊列的列名當作鍵,即how='inner',有多個重複列名則選取重複列名值都相同的行

# 指定「on」做爲鏈接鍵,left和right兩個DataFrame必須同時存在「on」列,鏈接鍵也可N對N(少用)
pd.merge(left, right, on="key")#默認how='inner',兩個表取key的交集行,right的的列放在left列右邊
pd.merge(left, right, on=["key1", "key2"])#兩個表取key1,key2都相同的行,right的的列放在left列右邊

pd.merge(left,  right,  left_on="key",  right_on="key")#兩個表取key列行相同的行,其餘重複列名變爲column_x,column_y,與on='key'相同

# suffixes:用於追加到重疊列名的末尾,默認爲("_x", "_y")
pd.merge(left,  right,  on="key",  suffixes=("_left",  "_right"))

# 指定鏈接方式:「inner」(默認),「left」,「right」,「outer」
pd.merge(left, right,on='key' how="outer")#產生以left和right的key值並集的行的dataframe

pd.merge(left_frame, right_frame, on='key', how='left')#產生以left_frame的key全部值爲行的dataframe,right_frame中的key沒有該值的話那些列數據爲NaN

pd.merge(left_frame, right_frame, on='key', how='right')#同上類似

pd.merge(left,  right,  left_on="lkey",  right_on="rkey")#左邊表lkey和右邊表rkey值相同的行,全部列都顯示,重複的_x,_y

  

2. join方法

dataframe內置的join方法是一種快速合併的方法。它默認以index做爲對齊的列。

(1)how參數

join中的how參數和merge中的how參數同樣,用來指定表合併保留數據的規則。

(2)on參數

在實際應用中若是右表的索引值正是左表的某一列的值,這時能夠經過將 右表的索引和左表的列對齊合併這樣靈活的方式進行合併。

result = left.join(right, on='key')

(3)suffix後綴參數

若是和表合併的過程當中遇到有一列兩個表都同名,可是值不一樣,合併的時候又都想保留下來,就能夠用suffixes給每一個表的重複列名增長後綴。

result = pd.merge(left, right, on='k', suffixes=['_l', '_r'])

3. 組合多個dataframe

一次組合多個dataframe的時候能夠傳入元素爲dataframe的列表或者tuple。一次join多個,一次解決屢次煩惱~

result = left.join([right, right2])

merge與concat的區別在於,merge須要依據某一共同的行或列來進行合併

使用pd.merge()合併時,會自動根據二者相同column名稱的那一列,做爲key來進行合併。注意每一列元素的順序不要求一致

df_id = DataFrame({'id':[1,2,3,4]},index = list('ABCD'))
df_id
 
df2 = DataFrame(np.random.randint(0,150,size=(4,3) ),index=list('ABCD'),columns=['語文','政治','歷史'])
df2 = pd.concat([df2,df_id],axis = 1)
df2

 

(1)一對一合併

# merge 默認狀況下,列增長了
df1.merge(df2)

(2)多對一合併

(3)多對多合併

4. key的規範化

  • 使用on=顯式指定哪一列爲key,當有多個key相同時使用
# 指明on根據那一列進行融合,不指名,根據根據全部的共同的列名進行融合
# 不指明的時候,語文和id都是共同列
df2.merge(df3,on = 'id',suffixes=('_期中','_期末') )

# df2 左邊
# df4 右邊
df2.merge(df4,left_on='id',right_on='Id')

  • 使用left_on和right_on指定左右兩邊的列做爲key,當左右兩邊的key都不相等時使用
df2.merge(df5,left_on='id',right_index=True)

5. 內合併和外合併

  • 內合併:只保留二者都有的key(默認模式)
df2.merge(df3,left_on='id',right_on='Id',how = 'inner')

  • 外合併 how='outer':補NaN
# 將兩個DataFrame中全部的數據,都保留下來
df2.merge(df3,left_on='id',right_on='Id',how = 'outer')

  • 左合併、右合併:how='left',how='right',
df2.merge(df3,left_on='id',right_on='Id',how = 'left')
df2.merge(df3,left_on='id',right_on='Id',how = 'right')

6. 列衝突的解決

當列衝突時,即有多個列名稱相同時,須要使用on=來指定哪個列做爲key,配合suffixes指定衝突列名,可使用suffixes=本身指定後綴

 

參考文獻:

【1】pandas數據合併與重塑(pd.concat篇)

【2】pandas的拼接操做

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息