pandas的拼接分爲兩種:python
生成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])
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
# 現將表構成list,而後在做爲concat的輸入 frames = [df1, df2, df3] result = pd.concat(frames)
要在相接的時候在加上一個層次的key來識別數據源自於哪張表,能夠增長key參數 3d
result = pd.concat(frames, keys=['x', 'y', 'z'])
效果以下:code
有三種級聯方式:blog
當axis = 1的時候,concat就是行對齊,而後將不一樣列名稱的兩張表合併排序
result = pd.concat([df1, df4], axis=1)
加上join參數的屬性,若是爲’inner’獲得的是兩表的交集,若是是outer,獲得的是兩表的並集。
result = pd.concat([df1, df4], axis=1, join='inner')
若是有join_axes的參數傳入,能夠指定根據那個軸來對齊數據
例如根據df1表對齊數據,就會保留指定的df1表的軸,而後將df4的表與之拼接
result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])
append是series和dataframe的方法,使用它就是默認沿着列進行憑藉(axis = 0,列對齊)
result = df1.append(df2)
若是兩個表的index都沒有實際含義,使用ignore_index參數,置true,合併的兩個表就是根據列字段對齊,而後合併。最後再從新整理一個新的index。
前面提到的keys參數能夠用來給合併後的表增長key來區分不一樣的表數據來源
result = pd.concat(frames, keys=['x', 'y', 'z'])
pieces = {'x': df1, 'y': df2, 'z': df3} result = pd.concat(pieces)
append方法能夠將 series 和 字典的數據做爲dataframe的新一行插入。
s2 = pd.Series(['X0', 'X1', 'X2', 'X3'], index=['A', 'B', 'C', 'D']) result = df1.append(s2, ignore_index=True)
若是遇到兩張表的列字段原本就不同,但又想將兩個表合併,其中無效的值用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的默認合併方法:merge用於表內部基於 index-on-index 和 index-on-column(s) 的合併,但默認是基於index來合併。
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
dataframe內置的join方法是一種快速合併的方法。它默認以index做爲對齊的列。
join中的how參數和merge中的how參數同樣,用來指定表合併保留數據的規則。
在實際應用中若是右表的索引值正是左表的某一列的值,這時能夠經過將 右表的索引和左表的列對齊合併這樣靈活的方式進行合併。
result = left.join(right, on='key')
若是和表合併的過程當中遇到有一列兩個表都同名,可是值不一樣,合併的時候又都想保留下來,就能夠用suffixes給每一個表的重複列名增長後綴。
result = pd.merge(left, right, on='k', suffixes=['_l', '_r'])
一次組合多個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
# merge 默認狀況下,列增長了 df1.merge(df2)
# 指明on根據那一列進行融合,不指名,根據根據全部的共同的列名進行融合 # 不指明的時候,語文和id都是共同列 df2.merge(df3,on = 'id',suffixes=('_期中','_期末') )
# df2 左邊 # df4 右邊 df2.merge(df4,left_on='id',right_on='Id')
df2.merge(df5,left_on='id',right_index=True)
df2.merge(df3,left_on='id',right_on='Id',how = 'inner')
# 將兩個DataFrame中全部的數據,都保留下來 df2.merge(df3,left_on='id',right_on='Id',how = 'outer')
df2.merge(df3,left_on='id',right_on='Id',how = 'left') df2.merge(df3,left_on='id',right_on='Id',how = 'right')
當列衝突時,即有多個列名稱相同時,須要使用on=來指定哪個列做爲key,配合suffixes指定衝突列名,可使用suffixes=本身指定後綴
參考文獻:
【2】pandas的拼接操做