日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

pandas之DataFrame合并merge

發(fā)布時(shí)間:2023/11/29 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pandas之DataFrame合并merge 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、merge

merge操作實(shí)現(xiàn)兩個(gè)DataFrame之間的合并,類似于sql兩個(gè)表之間的關(guān)聯(lián)查詢。merge的使用方法及參數(shù)解釋如下:

pd.merge(left, right, on=None, how='inner', left_on=None, right_on=None, left_index=False, right_index=False,
   sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
  • left和right:第一個(gè)DataFrame和第二個(gè)DataFrame對(duì)象,merge只能實(shí)現(xiàn)兩個(gè)DataFrame的合并,無法一次實(shí)現(xiàn)多個(gè)合并
  • on:指定參考column,要求兩個(gè)df必須至少有一個(gè)相同的column,默認(rèn)為None以最多相同的column為參考
  • how:合并的方式,默認(rèn)為inner取參考column的交集,outer取并集保留所有行;outer、left、right中的缺失值都以NaN填充;left按照左邊對(duì)象為參考進(jìn)行合并即保留左邊的所有行,right按照右邊對(duì)象為參考進(jìn)行合并即保留右邊所有行,
  • left_on=None和right_on=None:以上on是在兩個(gè)df有相同的column的情況下使用,如果兩個(gè)df沒有相同的column,使用left_on和right_on分別指明左邊和右邊的參考column
  • left_index和right_index:指定是否以索引為參考進(jìn)行合并
  • sort:合并結(jié)果是否按on指定的參考進(jìn)行排序
  • suffixed:合并后如果有重復(fù)column,分別加上什么后綴?

?

下面對(duì)每個(gè)參數(shù)進(jìn)行演示

on:指定參考column,如果不指定默認(rèn)為None,以兩者相同列的最多數(shù)為參考;index重新生成為從0開始的整數(shù)。

df1 = pd.DataFrame({'key1':['a','b','c','d'],'key2':['e','f','g','h'],'key3':['i','j','k','l']},index=['k','l','m','n',]) df2 = pd.DataFrame({'key1':['a','B','c','d'],'key2':['e','f','g','H'],'key4':['i','j','K','L']},index = ['p','q','u','v']) print(df1) print(df2) print(pd.merge(df1,df2,on='key1')) print(pd.merge(df1,df2,on='key2')) print(pd.merge(df1,df2,on=['key1','key2'])) print(pd.merge(df1,df2)) #可以看到不加on參數(shù),系統(tǒng)自動(dòng)以個(gè)數(shù)最多的相同column為參考 # key1 key2 key3 # k a e i # l b f j # m c g k # n d h l # key1 key2 key4 # p a e i # q B f j # u c g K # v d H L # key1 key2_x key3 key2_y key4 # 0 a e i e i # 1 c g k g K # 2 d h l H L # key1_x key2 key3 key1_y key4 # 0 a e i a i # 1 b f j B j # 2 c g k c K # key1 key2 key3 key4 # 0 a e i i # 1 c g k K # key1 key2 key3 key4 # 0 a e i i # 1 c g k K 參數(shù)on演示

?

how:指定合并方式,如果不指定默認(rèn)為inner

inner相當(dāng)于sql中的=,outer相當(dāng)于sql中的full join,left相當(dāng)于sql中的left join,right相當(dāng)于sql中的right join;index重新生成為從0開始的整數(shù)。

對(duì)于outer、left、right來說可能會(huì)出現(xiàn)缺失值,全部以NaN填充。

df1 = pd.DataFrame({'key1':['a','b','c','d'],'key2':['e','f','g','h'],'key3':['i','j','k','l']},index=['k','l','m','n',]) df2 = pd.DataFrame({'key1':['a','B','c','d'],'key2':['e','f','g','H'],'key4':['i','j','K','L']},index = ['p','q','u','v']) print(df1) print(df2) print(pd.merge(df1,df2,how='inner')) #默認(rèn)方式,取交集 print(pd.merge(df1,df2,how='outer')) #取并集 print(pd.merge(df1,df2,how='left')) #以左邊為參考,即保留左邊所有行 print(pd.merge(df1,df2,how='right')) #以右邊為參考,即保留右邊所有行 # key1 key2 key3 # k a e i # l b f j # m c g k # n d h l # key1 key2 key4 # p a e i # q B f j # u c g K # v d H L # key1 key2 key3 key4 # 0 a e i i # 1 c g k K # key1 key2 key3 key4 # 0 a e i i # 1 b f j NaN # 2 c g k K # 3 d h l NaN # 4 B f NaN j # 5 d H NaN L # key1 key2 key3 key4 # 0 a e i i # 1 b f j NaN # 2 c g k K # 3 d h l NaN # key1 key2 key3 key4 # 0 a e i i # 1 c g k K # 2 B f NaN j # 3 d H NaN L 參數(shù)how演示

?

left_on和right_on:默認(rèn)都為False,但是如果兩個(gè)DataFrame沒有相同的column而又需要對(duì)它們的按列合并,則需要使用left_on和right_on分別指明兩邊的參考列;index重新生成為從0開始的整數(shù)。

但是left_on和right_on不是必須成對(duì)出現(xiàn),下面關(guān)于left_index和right_index會(huì)涉及到。

df1 = pd.DataFrame({'key1':['a','b','c','d'],'key2':['e','f','g','h'],'key3':['i','j','k','l']},index=['k','l','m','n']) df2 = pd.DataFrame({'key4':['a','B','c','d'],'key5':['e','f','g','H'],'key6':['i','j','K','L']},index = ['p','q','u','v']) print(df1) print(df2) # print(pd.merge(df1,df2,df1 = pd.DataFrame({'key1':['a','b','c','d'],'key2':['e','f','g','h'],'key3':['i','j','k','l']},index=['k','l','m','n']) df2 = pd.DataFrame({'key4':['a','B','c','d'],'key5':['e','f','g','H'],'key6':['i','j','K','L']},index = ['p','q','u','v']) print(df1) print(df2) # print(pd.merge(df1,df2,left_on='key1',right_on='key4')) # key1 key2 key3 # k a e i # l b f j # m c g k # n d h l # key4 key5 key6 # p a e i # q B f j # u c g K # v d H L # key1 key2 key3 key4 key5 key6 # 0 a e i a e i # 1 c g k c g K # 2 d h l d H L='key1',right_on='key4')) # key1 key2 key3 # k a e i # l b f j # m c g k # n d h l # key4 key5 key6 # p a e i # q B f j # u c g K # v d H L # key1 key2 key3 key4 key5 key6 # 0 a e i a e i # 1 c g k c g K # 2 d h l d H L 參數(shù)left_on和right_on演示

?

left_index和right_index:默認(rèn)都為False,如果需要按索引進(jìn)行合并,則需要使用left_index和right_index指明以index為參考。(on、left_on、right_on都是指定以column為參考)

如果使用了left_index或者right_index,必須指明另一方的參考鍵。

結(jié)果除了包含兩個(gè)DataFrame的所有列,還會(huì)生成一個(gè)新的列,新列即以指定的兩個(gè)參考進(jìn)行合并后的結(jié)果。

如果是left_on =? '**' 和right_index = True或者left_index =? True 和right_on = '**',index取on所在的一方,如果是left_index =? True和right_index = True,取兩者相同的即可。

df1 = pd.DataFrame({'key1':['a','b','c','d'],'key2':['e','f','g','h']},index=['k','l','m','n']) df2 = pd.DataFrame({'key1':['k',6,'l']},index=['a','m','c']) print(df1) print(df2) print(pd.merge(df1,df2,left_on='key1',right_index=True)) #index取df1的 print(pd.merge(df1,df2,left_index=True,right_on='key1')) #index取df2的 print(pd.merge(df1,df2,left_index=True,right_index=True)) #index取兩者交集 # key1 key2 # k a e # l b f # m c g # n d h # key1 # a k # m 6 # c l # key1 key1_x key2 key1_y # k a a e k # m c c g l # key1 key1_x key2 key1_y # a k a e k # c l b f l # key1_x key2 key1_y # m c g 6 參數(shù)left_index和right_index演示

?

sort:結(jié)果是否按照參考進(jìn)行排序,默認(rèn)不排序;數(shù)字按照大小排序,字符串按照A-Za-z排序。

merge結(jié)果的顯示順序默認(rèn)是按照df1、df2的行順序進(jìn)行顯示,

df1 = pd.DataFrame({'key1':['d','a','c','B'],'key2':[3,6,1,8]},index=['k','l','m','n']) df2 = pd.DataFrame({'key1':['c','B','a','d'],'key2':[3,8,2,1]},index = ['p','q','u','v']) print(df1) print(df2) print(pd.merge(df1,df2,on='key2',)) print(pd.merge(df1,df2,on='key1',sort=True)) # key1 key2 # k d 3 # l a 6 # m c 1 # n B 8 # key1 key2 # p c 3 # q B 8 # u a 2 # v d 1 # key1_x key2 key1_y # 0 d 3 c # 1 c 1 d # 2 B 8 B # key1 key2_x key2_y # 0 B 8 8 # 1 a 6 2 # 2 c 1 3 # 3 d 3 1 參數(shù)sort演示

pandas自帶的排序方法df.sort_index()、df.sort_values('column')

?

suffixes:如果兩者相同的column未被指定為參考列,那么結(jié)果中這兩個(gè)相同的column名稱會(huì)被加上后綴,默認(rèn)為左右分別為_x和_y

df1 = pd.DataFrame({'key1':['a','b','c','d'],'key2':['e','f','g','h']},index=['k','l','m','n',]) df2 = pd.DataFrame({'key1':['a','B','c','d'],'key2':['e','f','g','H']},index = ['p','q','u','v']) print(df1) print(df2) print(pd.merge(df1,df2,on='key1')) print(pd.merge(df1,df2,on='key2',suffixes=('_df1','_df2'))) # key1 key2_x key2_y # 0 a e e # 1 c g g # 2 d h H # key1_df1 key2 key1_df2 # 0 a e a # 1 b f B # 2 c g c 參數(shù)suffixed演示

?

二、join

join是默認(rèn)按照index、以left方式實(shí)現(xiàn)兩個(gè)DataFrame的合并,即默認(rèn)用法相當(dāng)于merge的pd.merge(df1,df2,how = 'left',left_index =? True,right_index = True),缺失值默認(rèn)為NaN

df1.join(df2, on=None, how='left', lsuffix='', rsuffix='',sort=False)

由于join的lsuffix和rsuffix默認(rèn)值為空,因此如果兩者有相同的column,一定要手動(dòng)指定這兩個(gè)參數(shù),否則會(huì)報(bào)錯(cuò)。

?

join也可以通過on指定前面的DataFrame以column為參考與后面的index關(guān)聯(lián)實(shí)現(xiàn)合并,即相當(dāng)于merge的pd.merge(df1,df2,how = 'left',left_on ='**',right_index = True)。

index重新生成為從0開始的整數(shù)。

df1 = pd.DataFrame({'key1':['a','b','c','d'],'key2':[1,2,3,4]}) df2 = pd.DataFrame({'key1':['a','B','c','d'],'key3':['e','f','g','H']}) print(df1) print(df2) print(df1.join(df2,on='key2',lsuffix='_df1',rsuffix='_df2')) # key1 key2 # 0 a 1 # 1 b 2 # 2 c 3 # 3 d 4 # key1 key3 # 0 a e # 1 B f # 2 c g # 3 d H # key1_df1 key2 key1_df2 key3 # 0 a 1 B f # 1 b 2 c g # 2 c 3 d H # 3 d 4 NaN NaN join演示

?

三、concat

上述merge和join都是指定了column或者index為參考對(duì)兩個(gè)DataFrame進(jìn)行合并,concat是單純的對(duì)DataFrame進(jìn)行堆疊,并且空值填充為NaN。

concat可一次實(shí)現(xiàn)對(duì)多個(gè)pandas對(duì)象的堆疊,默認(rèn)是對(duì)所有列在垂直方向進(jìn)行堆疊、index為原來各自的索引。

concat( [obj1, obj2, obj3], axis=0, join="outer", join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True)

?

如果是在水平方向進(jìn)行堆疊,需要指定axis=1,如果合并后有相同列名稱,可通過add_prefix或者add_suffix為其中一個(gè)添加名稱后綴。

s1 = pd.Series([1,2,3],index=['a','b','c'],name='s1') s2 = pd.Series([3,4,'w'],index=['c','x','y'],name='s2') print(s1) print(s2) print(pd.concat([s1,s2])) print(pd.concat([s1,s2],axis=1,sort=False)) # a 1 # b 2 # c 3 # Name: s1, dtype: int64 # c 3 # x 4 # y w # Name: s2, dtype: object # a 1 # b 2 # c 3 # c 3 # x 4 # y w # dtype: object # s1 s2 # a 1.0 NaN # b 2.0 NaN # c 3.0 3 # x NaN 4 # y NaN w 參數(shù)axis演示

?

join表示堆疊方式,默認(rèn)為outer,只有outer和inner方式,inner表示只對(duì)相同列進(jìn)行堆疊。

s1 = pd.DataFrame([[1,2,3],[4,5,6]],columns=['a','b','c']) s2 = pd.DataFrame([[3,4,'w'],[5,6,'x']],columns=['a','b','d']) print(s1) print(s2) print(pd.concat([s1,s2])) print(pd.concat([s1,s2],join="inner")) # a b c # 0 1 2 3 # 1 4 5 6 # a b d # 0 3 4 w # 1 5 6 x # a b c d # 0 1 2 3.0 NaN # 1 4 5 6.0 NaN # 0 3 4 NaN w # 1 5 6 NaN x # a b # 0 1 2 # 1 4 5 # 0 3 4 # 1 5 6 參數(shù)join演示

?

ignore_index表示是否保留原對(duì)象的index,默認(rèn)保留,True表示結(jié)果的index為從0開始的整數(shù)。

s1 = pd.Series([1,2,3],index=['a','b','c'],name='s1') s2 = pd.Series([3,4,'w'],index=['c','x','y'],name='s2') print(pd.concat([s1,s2])) print(pd.concat([s1,s2],ignore_index=True)) # a 1 # b 2 # c 3 # c 3 # x 4 # y w # dtype: object # 0 1 # 1 2 # 2 3 # 3 3 # 4 4 # 5 w # dtype: object 參數(shù)ignore_index演示

?

join_axes指定結(jié)果顯示的行索引

s1 = pd.Series([1,2,3],index=['a','b','c'],name='s1') s2 = pd.Series([3,4,'w'],index=['c','x','y'],name='s2') print(pd.concat([s1,s2],axis=1)) print(pd.concat([s1,s2],axis=1,join_axes=[['a','c']])) # s1 s2 # a 1.0 NaN # b 2.0 NaN # c 3.0 3 # x NaN 4 # y NaN w # s1 s2 # a 1 NaN # c 3 3 參數(shù)join_axes演示

?

對(duì)于Seris來說,默認(rèn)按照豎直方向堆疊,如果再指定keys,則會(huì)形成一個(gè)層次索引。

如果在設(shè)置axis=1的情況下即按照水平方向進(jìn)行堆疊,再指定keys,則keys的值會(huì)成為column。

s1 = pd.Series([1,2,3],index=['a','b','c'],name='s1') s2 = pd.Series([3,4,'w'],index=['c','x','y'],name='s2') print(pd.concat([s1,s2])) #豎直方向堆疊 print(pd.concat([s1,s2],keys=['s1','s2'])) #豎直方向堆疊,并形成一個(gè)層次索引 print(pd.concat([s1,s2],axis=1,keys=['s1','s2'])) #水平方向堆疊,keys的值為column # a 1 # b 2 # c 3 # c 3 # x 4 # y w # dtype: object # s1 a 1 # b 2 # c 3 # s2 c 3 # x 4 # y w # dtype: object # s1 s2 # a 1.0 NaN # b 2.0 NaN # c 3.0 3 # x NaN 4 # y NaN w 參數(shù)keys演示

?

四、替換空值combine_first

在相同index和column的位置,用一個(gè)對(duì)象的值去替換另一個(gè)對(duì)象的空值NaN。

df1.combine_forst(df2),如果df2有不在df1中的index和column,直接追加上去。

df1 = pd.DataFrame([[1,np.nan,3],[np.nan,5,6]],columns=['a','b','c']) df2 = pd.DataFrame([[3,4,'w'],[5,6,'x'],[7,8,9]],columns=['a','b','d']) print(df1) print(df2) print(df1.combine_first(df2)) #對(duì)于index為0和1,在對(duì)應(yīng)column位置使用df2的值替換df1的空值 #df2中的index=2和column='d'不在df1中,結(jié)果保留這一行和這里一列, # a b c # 0 1.0 NaN 3 # 1 NaN 5.0 6 # a b d # 0 3 4 w # 1 5 6 x # 2 7 8 9 # a b c d # 0 1.0 4.0 3.0 w # 1 5.0 5.0 6.0 x # 2 7.0 8.0 NaN 9 combine_first演示

?

五、更新update

在相同index和column的位置,使用一個(gè)對(duì)象的值去更新原對(duì)象的值,該方法沒有返回值,直接修改原對(duì)象。

df1.update(df2),更新df1,結(jié)果只包含原對(duì)象的行和列。

df1 = pd.DataFrame([[1,np.nan,3],[np.nan,5,6]],columns=['a','b','c']) df2 = pd.DataFrame([[3,4,'w'],[5,6,'x'],[7,8,9]],columns=['a','b','d']) df1.update(df2) #沒有返回值,直接打印結(jié)果為none,且df2中的第3行和d列不追加到df1 print(df1) # a b c # 0 3.0 4.0 3 # 1 5.0 6.0 6 update演示

?

六、去重duplicate與drop_duplicates

duplicate()結(jié)果是一個(gè)值為布爾的Seris,通過obj[?df.duplicated()==False?]來取出Seris和DataFrame中的重復(fù)值、行,新結(jié)果的index為False對(duì)應(yīng)的索引。

對(duì)于Seris,從第一個(gè)值開始判斷,如果元素第一次出現(xiàn),則duplicate后的值為True,否則為False

對(duì)應(yīng)于DataFrame,從第一行開始判斷,如果行的內(nèi)容第一次出現(xiàn)(要求行內(nèi)元素順序一致),則duplicate后的值為True,否則為False。如

s = pd.Series([1,2,2,1,3,3]) print(s.duplicated()) print(s[s.duplicated()==False]) print('----------------') df = pd.DataFrame([[1,2,3],[4,5,6],[1,3,2],[4,5,6],[7,8,9]]) print(df.duplicated()) #[1,2,3]和[1,3,2]不重復(fù) print(df[df.duplicated()==False]) # 0 False # 1 False # 2 True # 3 True # 4 False # 5 True # dtype: bool # 0 1 # 1 2 # 4 3 # dtype: int64 # ---------------- # 0 False # 1 False # 2 False # 3 True # 4 False # dtype: bool # 0 1 2 # 0 1 2 3 # 1 4 5 6 # 2 1 3 2 # 4 7 8 9 duplicated去重

?

drop_duplicates( )刪除重復(fù)的元素,默認(rèn)生成新的結(jié)果不修改原對(duì)象,如果添加參數(shù)inplace=True則直接修改原對(duì)象。新結(jié)果的index為元素第一次出現(xiàn)時(shí)對(duì)應(yīng)的索引

s = pd.Series([1,2,2,1,3,3]) print(s.drop_duplicates()) df = pd.DataFrame([[1,2,3],[4,5,6],[1,3,2],[4,5,6],[7,8,9]]) df.drop_duplicates(inplace=True) print(df) # 0 1 # 1 2 # 4 3 # dtype: int64 # 0 1 2 # 0 1 2 3 # 1 4 5 6 # 2 1 3 2 # 4 7 8 9 drop_duplicates去重

?

七、替換replace

replace('原元素','新元素')將原元素替換成新元素

如果要同時(shí)替換多個(gè)元素,用列表表示即可;如果要將不同的元素替換成不同的內(nèi)容,使用字典。

s = pd.Series(list('abcafc')) print(s.replace('a','A')) #將每個(gè)a替換成A print(s.replace(['a','b'],'W')) #將所有a、b替換成W print(s.replace({'a':'A','f':'F'})) #將a替換成A,f替換成F df = pd.DataFrame([[1,2,3],[4,5,6],[2,5,8]]) print(df.replace(2,'a')) #將2替換成a replace演示

?

轉(zhuǎn)載于:https://www.cnblogs.com/Forever77/p/11285302.html

總結(jié)

以上是生活随笔為你收集整理的pandas之DataFrame合并merge的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。