pandas dataframe的合并實(shí)現(xiàn)(append, merge, concat)
創(chuàng)建2個(gè)DataFrame:
>>> df1 = pd.DataFrame(np.ones((4, 4))*1, columns=list('DCBA'), index=list('4321')) >>> df2 = pd.DataFrame(np.ones((4, 4))*2, columns=list('FEDC'), index=list('6543')) >>> df3 = pd.DataFrame(np.ones((4, 4))*3, columns=list('FEBA'), index=list('6521')) >>> df1 D C B A 4 1.0 1.0 1.0 1.0 3 1.0 1.0 1.0 1.0 2 1.0 1.0 1.0 1.0 1 1.0 1.0 1.0 1.0 >>> df2 F E D C 6 2.0 2.0 2.0 2.0 5 2.0 2.0 2.0 2.0 4 2.0 2.0 2.0 2.0 3 2.0 2.0 2.0 2.0 >>> df3 F E B A 6 3.0 3.0 3.0 3.0 5 3.0 3.0 3.0 3.0 2 3.0 3.0 3.0 3.0 1 3.0 3.0 3.0 3.0
1,concat
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)
示例:
>>> pd.concat([df1, df2]) A B C D E F 4 1.0 1.0 1.0 1.0 NaN NaN 3 1.0 1.0 1.0 1.0 NaN NaN 2 1.0 1.0 1.0 1.0 NaN NaN 1 1.0 1.0 1.0 1.0 NaN NaN 6 NaN NaN 2.0 2.0 2.0 2.0 5 NaN NaN 2.0 2.0 2.0 2.0 4 NaN NaN 2.0 2.0 2.0 2.0 3 NaN NaN 2.0 2.0 2.0 2.0
1.1,axis
默認(rèn)值:axis=0
axis=0:豎方向(index)合并,合并方向index作列表相加,非合并方向columns取并集
axis=1:橫方向(columns)合并,合并方向columns作列表相加,非合并方向index取并集
axis=0:
>>> pd.concat([df1, df2], axis=0) A B C D E F 4 1.0 1.0 1.0 1.0 NaN NaN 3 1.0 1.0 1.0 1.0 NaN NaN 2 1.0 1.0 1.0 1.0 NaN NaN 1 1.0 1.0 1.0 1.0 NaN NaN 6 NaN NaN 2.0 2.0 2.0 2.0 5 NaN NaN 2.0 2.0 2.0 2.0 4 NaN NaN 2.0 2.0 2.0 2.0 3 NaN NaN 2.0 2.0 2.0 2.0
axis=1:
>>> pd.concat([df1, df2], axis=1) D C B A F E D C 1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN 2 1.0 1.0 1.0 1.0 NaN NaN NaN NaN 3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 5 NaN NaN NaN NaN 2.0 2.0 2.0 2.0 6 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
備注:原df中,取并集的行/列名稱(chēng)不能有重復(fù)項(xiàng),即axis=0時(shí)columns不能有重復(fù)項(xiàng),axis=1時(shí)index不能有重復(fù)項(xiàng):
>>> df1.columns = list('DDBA') >>> pd.concat([df1, df2], axis=0) ValueError: Plan shapes are not aligned
1.2,join
默認(rèn)值:join=‘outer'
非合并方向的行/列名稱(chēng):取交集(inner),取并集(outer)。
axis=0時(shí)join='inner',columns取交集:
>>> pd.concat([df1, df2], axis=0, join='inner') D C 4 1.0 1.0 3 1.0 1.0 2 1.0 1.0 1 1.0 1.0 6 2.0 2.0 5 2.0 2.0 4 2.0 2.0 3 2.0 2.0
axis=1時(shí)join='inner',index取交集:
>>> pd.concat([df1, df2], axis=1, join='inner') D C B A F E D C 4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
1.3,join_axes
默認(rèn)值:join_axes=None,取并集
合并后,可以設(shè)置非合并方向的行/列名稱(chēng),使用某個(gè)df的行/列名稱(chēng)
axis=0時(shí)join_axes=[df1.columns],合并后columns使用df1的:
>>> pd.concat([df1, df2], axis=0, join_axes=[df1.columns]) D C B A 4 1.0 1.0 1.0 1.0 3 1.0 1.0 1.0 1.0 2 1.0 1.0 1.0 1.0 1 1.0 1.0 1.0 1.0 6 2.0 2.0 NaN NaN 5 2.0 2.0 NaN NaN 4 2.0 2.0 NaN NaN 3 2.0 2.0 NaN NaN
axis=1時(shí)axes=[df1.index],合并后index使用df2的:
pd.concat([df1, df2], axis=1, join_axes=[df1.index]) D C B A F E D C 4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 2 1.0 1.0 1.0 1.0 NaN NaN NaN NaN 1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
同時(shí)設(shè)置join和join_axes的,以join_axes為準(zhǔn):
>>> pd.concat([df1, df2], axis=0, join='inner', join_axes=[df1.columns]) D C B A 4 1.0 1.0 1.0 1.0 3 1.0 1.0 1.0 1.0 2 1.0 1.0 1.0 1.0 1 1.0 1.0 1.0 1.0 6 2.0 2.0 NaN NaN 5 2.0 2.0 NaN NaN 4 2.0 2.0 NaN NaN 3 2.0 2.0 NaN NaN
1.4,ignore_index
默認(rèn)值:ignore_index=False
合并方向是否忽略原行/列名稱(chēng),而采用系統(tǒng)默認(rèn)的索引,即從0開(kāi)始的int。
axis=0時(shí)ignore_index=True,index采用系統(tǒng)默認(rèn)索引:
>>> pd.concat([df1, df2], axis=0, ignore_index=True) A B C D E F 0 1.0 1.0 1.0 1.0 NaN NaN 1 1.0 1.0 1.0 1.0 NaN NaN 2 1.0 1.0 1.0 1.0 NaN NaN 3 1.0 1.0 1.0 1.0 NaN NaN 4 NaN NaN 2.0 2.0 2.0 2.0 5 NaN NaN 2.0 2.0 2.0 2.0 6 NaN NaN 2.0 2.0 2.0 2.0 7 NaN NaN 2.0 2.0 2.0 2.0
axis=1時(shí)ignore_index=True,columns采用系統(tǒng)默認(rèn)索引:
>>> pd.concat([df1, df2], axis=1, ignore_index=True) 0 1 2 3 4 5 6 7 1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN 2 1.0 1.0 1.0 1.0 NaN NaN NaN NaN 3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 5 NaN NaN NaN NaN 2.0 2.0 2.0 2.0 6 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
1.5,keys
默認(rèn)值:keys=None
可以加一層標(biāo)簽,標(biāo)識(shí)行/列名稱(chēng)屬于原來(lái)哪個(gè)df。
axis=0時(shí)設(shè)置keys:
>>> pd.concat([df1, df2], axis=0, keys=['x', 'y']) A B C D E F x 4 1.0 1.0 1.0 1.0 NaN NaN 3 1.0 1.0 1.0 1.0 NaN NaN 2 1.0 1.0 1.0 1.0 NaN NaN 1 1.0 1.0 1.0 1.0 NaN NaN y 6 NaN NaN 2.0 2.0 2.0 2.0 5 NaN NaN 2.0 2.0 2.0 2.0 4 NaN NaN 2.0 2.0 2.0 2.0 3 NaN NaN 2.0 2.0 2.0 2.0
axis=1時(shí)設(shè)置keys:
>>> pd.concat([df1, df2], axis=1, keys=['x', 'y']) x y D C B A F E D C 1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN 2 1.0 1.0 1.0 1.0 NaN NaN NaN NaN 3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 5 NaN NaN NaN NaN 2.0 2.0 2.0 2.0 6 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
也可以傳字典取代keys:
>>> pd.concat({'x': df1, 'y': df2}, axis=0) A B C D E F x 4 1.0 1.0 1.0 1.0 NaN NaN 3 1.0 1.0 1.0 1.0 NaN NaN 2 1.0 1.0 1.0 1.0 NaN NaN 1 1.0 1.0 1.0 1.0 NaN NaN y 6 NaN NaN 2.0 2.0 2.0 2.0 5 NaN NaN 2.0 2.0 2.0 2.0 4 NaN NaN 2.0 2.0 2.0 2.0 3 NaN NaN 2.0 2.0 2.0 2.0
1.6,levels
默認(rèn)值:levels=None
明確行/列名稱(chēng)取值范圍:
>>> pd.concat([df1, df2], axis=0, keys=['x', 'y'], levels=[['x', 'y', 'z', 'w']]) >>> df.index.levels [['x', 'y', 'z', 'w'], ['1', '2', '3', '4', '5', '6']]
1.7,sort
默認(rèn)值:sort=True,提示新版本會(huì)設(shè)置默認(rèn)為False,并取消該參數(shù)
但0.22.0中雖然取消了,還是設(shè)置為T(mén)rue
非合并方向的行/列名稱(chēng)是否排序。例如1.1中默認(rèn)axis=0時(shí)columns進(jìn)行了排序,axis=1時(shí)index進(jìn)行了排序。
axis=0時(shí)sort=False,columns不作排序:
>>> pd.concat([df1, df2], axis=0, sort=False) D C B A F E 4 1.0 1.0 1.0 1.0 NaN NaN 3 1.0 1.0 1.0 1.0 NaN NaN 2 1.0 1.0 1.0 1.0 NaN NaN 1 1.0 1.0 1.0 1.0 NaN NaN 6 2.0 2.0 NaN NaN 2.0 2.0 5 2.0 2.0 NaN NaN 2.0 2.0 4 2.0 2.0 NaN NaN 2.0 2.0 3 2.0 2.0 NaN NaN 2.0 2.0
axis=1時(shí)sort=False,index不作排序:
>>> pd.concat([df1, df2], axis=1, sort=False) D C B A F E D C 4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 2 1.0 1.0 1.0 1.0 NaN NaN NaN NaN 1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN 6 NaN NaN NaN NaN 2.0 2.0 2.0 2.0 5 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
1.8,concat多個(gè)DataFrame
>>> pd.concat([df1, df2, df3], sort=False, join_axes=[df1.columns]) D C B A 4 1.0 1.0 1.0 1.0 3 1.0 1.0 1.0 1.0 2 1.0 1.0 1.0 1.0 1 1.0 1.0 1.0 1.0 6 2.0 2.0 NaN NaN 5 2.0 2.0 NaN NaN 4 2.0 2.0 NaN NaN 3 2.0 2.0 NaN NaN 6 NaN NaN 3.0 3.0 5 NaN NaN 3.0 3.0 2 NaN NaN 3.0 3.0 1 NaN NaN 3.0 3.0
2,append
append(self, other, ignore_index=False, verify_integrity=False)
豎方向合并df,沒(méi)有axis屬性
不會(huì)就地修改,而是會(huì)創(chuàng)建副本
示例:
>>> df1.append(df2) # 相當(dāng)于pd.concat([df1, df2]) A B C D E F 4 1.0 1.0 1.0 1.0 NaN NaN 3 1.0 1.0 1.0 1.0 NaN NaN 2 1.0 1.0 1.0 1.0 NaN NaN 1 1.0 1.0 1.0 1.0 NaN NaN 6 NaN NaN 2.0 2.0 2.0 2.0 5 NaN NaN 2.0 2.0 2.0 2.0 4 NaN NaN 2.0 2.0 2.0 2.0 3 NaN NaN 2.0 2.0 2.0 2.0
2.1,ignore_index屬性
>>> df1.append(df2, ignore_index=True) A B C D E F 0 1.0 1.0 1.0 1.0 NaN NaN 1 1.0 1.0 1.0 1.0 NaN NaN 2 1.0 1.0 1.0 1.0 NaN NaN 3 1.0 1.0 1.0 1.0 NaN NaN 4 NaN NaN 2.0 2.0 2.0 2.0 5 NaN NaN 2.0 2.0 2.0 2.0 6 NaN NaN 2.0 2.0 2.0 2.0 7 NaN NaN 2.0 2.0 2.0 2.0
2.2,append多個(gè)DataFrame
和concat相同,append也支持append多個(gè)DataFrame
>>> df1.append([df2, df3], ignore_index=True) A B C D E F 0 1.0 1.0 1.0 1.0 NaN NaN 1 1.0 1.0 1.0 1.0 NaN NaN 2 1.0 1.0 1.0 1.0 NaN NaN 3 1.0 1.0 1.0 1.0 NaN NaN 4 NaN NaN 2.0 2.0 2.0 2.0 5 NaN NaN 2.0 2.0 2.0 2.0 6 NaN NaN 2.0 2.0 2.0 2.0 7 NaN NaN 2.0 2.0 2.0 2.0 8 3.0 3.0 NaN NaN 3.0 3.0 9 3.0 3.0 NaN NaN 3.0 3.0 10 3.0 3.0 NaN NaN 3.0 3.0 11 3.0 3.0 NaN NaN 3.0 3.0
3,merge
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
示例:
>>> left = pd.DataFrame({'A': ['a0', 'a1', 'a2', 'a3'], 'B': ['b0', 'b1', 'b2', 'b3'], 'k1': ['x', 'x', 'y', 'y']}) >>> right = pd.DataFrame({'C': ['c1', 'c2', 'c3', 'c4'], 'D': ['d1', 'd2', 'd3', 'd4'], 'k1': ['y', 'y', 'z', 'z']}) >>> left A B k1 0 a0 b0 x 1 a1 b1 x 2 a2 b2 y 3 a3 b3 y >>> right C D k1 0 c1 d1 y 1 c2 d2 y 2 c3 d3 z 3 c4 d4 z
對(duì)df1和df2進(jìn)行merge:
>>> pd.merge(left, right) A B k1 C D 0 a2 b2 y c1 d1 1 a2 b2 y c2 d2 2 a3 b3 y c1 d1 3 a3 b3 y c2 d2
可以看到只有df1和df2的key1=y的行保留了下來(lái),即默認(rèn)合并后只保留有共同列項(xiàng)并且值相等行(即交集)。
本例中l(wèi)eft和right的k1=y分別有2個(gè),最終構(gòu)成了2*2=4行。
如果沒(méi)有共同列會(huì)報(bào)錯(cuò):
>>> del left['k1'] >>> pd.merge(left, right) pandas.errors.MergeError: No common columns to perform merge on
3.1,on屬性
新增一個(gè)共同列,但沒(méi)有相等的值,發(fā)現(xiàn)合并返回是空列表,因?yàn)槟J(rèn)只保留所有共同列都相等的行:
>>> left['k2'] = list('1234') >>> right['k2'] = list('5678') >>> pd.merge(left, right) Empty DataFrame Columns: [B, A, k1, k2, F, E] Index: []
可以指定on,設(shè)定合并基準(zhǔn)列,就可以根據(jù)k1進(jìn)行合并,并且left和right共同列k2會(huì)同時(shí)變換名稱(chēng)后保留下來(lái):
>>> pd.merge(left, right, on='k1') A B k1 k2_x C D k2_y 0 a2 b2 y 3 c1 d1 5 1 a2 b2 y 3 c2 d2 6 2 a3 b3 y 4 c1 d1 5 3 a3 b3 y 4 c2 d2 6
默認(rèn)值:on的默認(rèn)值是所有共同列,本例為:on=['k1', 'k2']
3.2,how屬性
how取值范圍:'inner', 'outer', 'left', 'right'
默認(rèn)值:how='inner'
‘inner':共同列的值必須完全相等:
>>> pd.merge(left, right, on='k1', how='inner') A B k1 k2_x C D k2_y 0 a2 b2 y 3 c1 d1 5 1 a2 b2 y 3 c2 d2 6 2 a3 b3 y 4 c1 d1 5 3 a3 b3 y 4 c2 d2 6
‘outer':共同列的值都會(huì)保留,left或right在共同列上的差集,會(huì)對(duì)它們的缺失列項(xiàng)的值賦上NaN:
>>> pd.merge(left, right, on='k1', how='outer') A B k1 k2_x C D k2_y 0 a0 b0 x 1 NaN NaN NaN 1 a1 b1 x 2 NaN NaN NaN 2 a2 b2 y 3 c1 d1 5 3 a2 b2 y 3 c2 d2 6 4 a3 b3 y 4 c1 d1 5 5 a3 b3 y 4 c2 d2 6 6 NaN NaN z NaN c3 d3 7 7 NaN NaN z NaN c4 d4 8
‘left':根據(jù)左邊的DataFrame確定共同列的保留值,右邊缺失列項(xiàng)的值賦上NaN:
pd.merge(left, right, on='k1', how='left') A B k1 k2_x C D k2_y 0 a0 b0 x 1 NaN NaN NaN 1 a1 b1 x 2 NaN NaN NaN 2 a2 b2 y 3 c1 d1 5 3 a2 b2 y 3 c2 d2 6 4 a3 b3 y 4 c1 d1 5 5 a3 b3 y 4 c2 d2 6
‘right':根據(jù)右邊的DataFrame確定共同列的保留值,左邊缺失列項(xiàng)的值賦上NaN:
>>> pd.merge(left, right, on='k1', how='right') A B k1 k2_x C D k2_y 0 a2 b2 y 3 c1 d1 5 1 a3 b3 y 4 c1 d1 5 2 a2 b2 y 3 c2 d2 6 3 a3 b3 y 4 c2 d2 6 4 NaN NaN z NaN c3 d3 7 5 NaN NaN z NaN c4 d4 8
3.3,indicator
默認(rèn)值:indicator=False,不顯示合并方式
設(shè)置True表示顯示合并方式,即left / right / both:
>>> pd.merge(left, right, on='k1', how='outer', indicator=True) A B k1 k2_x C D k2_y _merge 0 a0 b0 x 1 NaN NaN NaN left_only 1 a1 b1 x 2 NaN NaN NaN left_only 2 a2 b2 y 3 c1 d1 5 both 3 a2 b2 y 3 c2 d2 6 both 4 a3 b3 y 4 c1 d1 5 both 5 a3 b3 y 4 c2 d2 6 both 6 NaN NaN z NaN c3 d3 7 right_only 7 NaN NaN z NaN c4 d4 8 right_only
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Django基礎(chǔ)知識(shí) web框架的本質(zhì)詳解
這篇文章主要介紹了Django基礎(chǔ)知識(shí) web框架的本質(zhì)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Python文件讀寫(xiě)處理日常任務(wù)終極工具實(shí)例
Python文件的讀寫(xiě)操作時(shí),有很多需要考慮的細(xì)節(jié),這包括文件打開(kāi)方式、讀取和寫(xiě)入數(shù)據(jù)的方法、異常處理等,在本文中,將深入探討Python中的文件操作,旨在提供全面的指南,幫你充分了解Python文件的讀寫(xiě)2023-11-11tensorflow中tf.reduce_mean函數(shù)的使用
這篇文章主要介紹了tensorflow中tf.reduce_mean函數(shù)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04基于python實(shí)現(xiàn)藍(lán)牙通信代碼實(shí)例
這篇文章主要介紹了基于python實(shí)現(xiàn)藍(lán)牙通信代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11python用TensorFlow做圖像識(shí)別的實(shí)現(xiàn)
這篇文章主要介紹了python用TensorFlow做圖像識(shí)別的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04python實(shí)點(diǎn)云分割k-means(sklearn)詳解
這篇文章主要為大家詳細(xì)介紹了Python實(shí)點(diǎn)云分割k-means,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05