溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python?pandas中如何實(shí)現(xiàn)合并與拼接

發(fā)布時(shí)間:2022-02-22 09:17:06 來源:億速云 閱讀:662 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下python pandas中如何實(shí)現(xiàn)合并與拼接,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

前言

在許多應(yīng)用中,數(shù)據(jù)可能來自不同的渠道,在數(shù)據(jù)處理的過程中常常需要將這些數(shù)據(jù)集進(jìn)行組合合并拼接,形成更加豐富的數(shù)據(jù)集。pandas提供了多種方法完全可以滿足數(shù)據(jù)處理的常用需求。具體來說包括有join、merge、concat、append等。

python?pandas中如何實(shí)現(xiàn)合并與拼接

一般來說

方法說明
join最簡單,主要用于基于索引的橫向合并拼接
merge最常用,主要用戶基于指定列的橫向合并拼接
concat最強(qiáng)大,可用于橫向和縱向合并拼接
append主要用于縱向追加
combine_first合并重疊數(shù)據(jù),填充缺失值
update將一個(gè)數(shù)據(jù)集的值更新到另一個(gè)數(shù)據(jù)集

下面就來逐一介紹每個(gè)方法

一、join

join主要用于基于索引的橫向合并拼接

在介紹pandas的join之前我們來看一下SQL對(duì)數(shù)據(jù)集join的幾種模式。如果大家對(duì)SQL比較熟悉的話應(yīng)該對(duì)SQL操作數(shù)據(jù)集進(jìn)行各種合并拼接印象深刻。SQL中各種JOIN的方法如下:

python?pandas中如何實(shí)現(xiàn)合并與拼接

pandas的join實(shí)現(xiàn)了left join、right jion、inner join、out jion常用的4中join方法

來自官網(wǎng)的參數(shù)說明:

dataframe.join(other,  # 待合并的另一個(gè)數(shù)據(jù)集
                   on=None,  # 連接的鍵
                   how='left',   # 連接方式:‘left', ‘right', ‘outer', ‘inner' 默認(rèn)是left
                   lsuffix='',  # 左邊(第一個(gè))數(shù)據(jù)集相同鍵的后綴
                   rsuffix='',  # 第二個(gè)數(shù)據(jù)集的鍵的后綴
                   sort=False)  # 是否根據(jù)連接的鍵進(jìn)行排序;默認(rèn)False

我們來看下實(shí)例,有兩個(gè)數(shù)據(jù)集一個(gè)是人員姓名,一個(gè)是人員的工資

left=pd.DataFrame(['張三','李四','王五','趙六','錢七'], index=[3,4,5,6,7],columns=['姓名'])
right=pd.DataFrame([13000,15000,9000,8600,10000], index=[3,4,5,6,8],columns=['工資'])

python?pandas中如何實(shí)現(xiàn)合并與拼接

注意,left和right的數(shù)據(jù)集分別都指定了index,因?yàn)閖oin主要用于基于索引的橫向合并拼接。

1、left join

left.join(right)  #默認(rèn)how='left'

python?pandas中如何實(shí)現(xiàn)合并與拼接

jion操作默認(rèn)是left jion的操作,可以看到left索引為7姓名為錢七,在right中沒有索引為7的對(duì)應(yīng)所以顯示left的姓名但right的工資為NaN,right中索引為8的數(shù)據(jù)在left中沒有索引為8的,所以沒有顯示。left join合并left的數(shù)據(jù)

left join 如下圖所示

python?pandas中如何實(shí)現(xiàn)合并與拼接

2、right join

left.join(right,how='right')

python?pandas中如何實(shí)現(xiàn)合并與拼接

右鏈接合并時(shí)可以看到,left的數(shù)據(jù)集沒有索引為8的項(xiàng),所以索引為8的項(xiàng)顯示right數(shù)據(jù)集的工資數(shù)據(jù)但姓名為NaN,在left中索引為7的項(xiàng)因?yàn)閞ight中不存在,所以沒有顯示。right join合并right的數(shù)據(jù)

right join 如下圖所示

python?pandas中如何實(shí)現(xiàn)合并與拼接

3、inner join

left.join(right,how='inner')

python?pandas中如何實(shí)現(xiàn)合并與拼接

內(nèi)鏈接合并時(shí),可以看到left數(shù)據(jù)集中的索引為7姓名為錢七因?yàn)樵趓ight數(shù)據(jù)集中找不到對(duì)應(yīng)的索引,right數(shù)據(jù)集中索引為8的在left找不到對(duì)應(yīng)的索引所以內(nèi)連接合并時(shí)索引7和8都沒有進(jìn)行合并,inner join只合并兩個(gè)數(shù)據(jù)集共有的數(shù)據(jù)

inner join 如下圖所示

python?pandas中如何實(shí)現(xiàn)合并與拼接

4、out join

left.join(right,how='outer')

python?pandas中如何實(shí)現(xiàn)合并與拼接

外鏈接合并時(shí),可以看到不管是left中的數(shù)據(jù)還是right中的數(shù)據(jù)都進(jìn)行了合并。right join合并兩個(gè)數(shù)據(jù)集中所有的數(shù)據(jù)。

outer join 如下圖所示

python?pandas中如何實(shí)現(xiàn)合并與拼接

join很簡單,但是它有局限性,因?yàn)樗荒芨鶕?jù)索引來合并。不能指定鍵來進(jìn)行合并。比如我要根據(jù)編號(hào)和姓名來合并,join就比較難辦了。但是pandas提供了merge的方法,可以指定列來進(jìn)行合并拼接。

二、merge

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)
參數(shù)名稱說明
left/right兩個(gè)不同的 DataFrame 對(duì)象。
on指定用于連接的鍵(即列標(biāo)簽的名字),該鍵必須同時(shí)存在于左右兩個(gè) DataFrame 中,如果沒有指定,并且其他參數(shù)也未指定, 那么將會(huì)以兩個(gè) DataFrame 的列名交集做為連接鍵。
left_on指定左側(cè) DataFrame 中作連接鍵的列名。該參數(shù)在左、右列標(biāo)簽名不相同,但表達(dá)的含義相同時(shí)非常有用。
right_on指定左側(cè) DataFrame 中作連接鍵的列名。
left_index布爾參數(shù),默認(rèn)為 False。如果為 True 則使用左側(cè) DataFrame 的行索引作為連接鍵,若 DataFrame 具有多層索引(MultiIndex),則層的數(shù)量必須與連接鍵的數(shù)量相等。
right_index布爾參數(shù),默認(rèn)為 False。如果為 True 則使用左側(cè) DataFrame 的行索引作為連接鍵。
how要執(zhí)行的合并類型,從 {‘left’, ‘right’, ‘outer’, ‘inner’} 中取值,默認(rèn)為“inner”內(nèi)連接。
sort布爾值參數(shù),默認(rèn)為True,它會(huì)將合并后的數(shù)據(jù)進(jìn)行排序;若設(shè)置為 False,則按照 how 給定的參數(shù)值進(jìn)行排序。
suffixes字符串組成的元組。當(dāng)左右 DataFrame 存在相同列名時(shí),通過該參數(shù)可以在相同的列名后附加后綴名,默認(rèn)為(’_x’,’_y’)。
copy默認(rèn)為 True,表示對(duì)數(shù)據(jù)進(jìn)行復(fù)制。

我們來看下面的數(shù)據(jù)集,在上面的數(shù)據(jù)集中l(wèi)eft數(shù)據(jù)集加入了員工的編號(hào),right數(shù)據(jù)集加入了編號(hào)及姓名。索引就按默認(rèn)的索引。

left=pd.DataFrame([[3,'張三'],[4,'李四'],[5,'王五'],[6,'趙六'],[7,'錢七']],
columns=['編號(hào)','姓名'])

right=pd.DataFrame([[3,'張三',13000],[4,'李四',15000],[5,'王五',9000],[6,'趙六',8600],[8,'孫八',10000]],
columns=['編號(hào)','姓名','工資'])

python?pandas中如何實(shí)現(xiàn)合并與拼接

pd.merge(left,right)

python?pandas中如何實(shí)現(xiàn)合并與拼接

沒有指定連接鍵,默認(rèn)用重疊列名,沒有指定連接方式,默認(rèn)inner內(nèi)連接(取left和right編號(hào)和姓名的交集)

和join一樣通過how來指定連接方式如:

pd.merge(left,right,how='left')

python?pandas中如何實(shí)現(xiàn)合并與拼接

how的連接方式和join一樣支持left、right、inner、outer

merge還可以指定多個(gè)列進(jìn)行合并鏈接,也就是和SQL一樣設(shè)置多個(gè)關(guān)聯(lián)的列。

pd.merge(left,right,how='outer',on=['編號(hào)','姓名'])

python?pandas中如何實(shí)現(xiàn)合并與拼接

如果兩個(gè)對(duì)象的列名不同,可以使用left_on,right_on分別指定,如我們把right數(shù)據(jù)集的“編碼”列標(biāo)簽改成“ID”后如果需要left數(shù)據(jù)集的"編號(hào)"和right數(shù)據(jù)集的"ID"進(jìn)行關(guān)聯(lián)

right=pd.DataFrame([[3,'張三',13000],[4,'李四',15000],[5,'王五',9000],[6,'趙六',8600],[8,'孫八',10000]],columns=['ID','姓名','工資'])

pd.merge(left,right,how='outer',left_on='編號(hào)',right_on='ID')

python?pandas中如何實(shí)現(xiàn)合并與拼接

雖然說merge已經(jīng)很強(qiáng)大了,但是pandas愿意給你更多,它提供了concat,可以實(shí)現(xiàn)橫向和縱向的合并與拼接。也就是說不但實(shí)現(xiàn)了SQL中的join還實(shí)現(xiàn)了union

三、concat

concat() 函數(shù)用于沿某個(gè)特定的軸執(zhí)行連接操作,語法如下:

pd.concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False)
參數(shù)名稱說明
objs一個(gè)序列或者是Series、DataFrame對(duì)象。
axis表示在哪個(gè)軸方向上(行或者列)進(jìn)行連接操作,默認(rèn) axis=0 表示行方向。
join指定連接方式,取值為{“inner”,“outer”},默認(rèn)為 outer 表示取并集,inner代表取交集。
ignore_index布爾值參數(shù),默認(rèn)為 False,如果為 True,表示不在連接的軸上使用索引。
join_axes表示索引對(duì)象的列表。

來看具體的例子

left2=pd.DataFrame([[1,'陳一'],[2,'周二']],columns=['編號(hào)','姓名'])

python?pandas中如何實(shí)現(xiàn)合并與拼接

1、縱向合并

concat默認(rèn)縱向拼接,我們要在left1數(shù)據(jù)集的基礎(chǔ)上把left2數(shù)據(jù)集給合并上去,很簡單用concat直接就可以合并。

df=pd.concat([left,left2])

python?pandas中如何實(shí)現(xiàn)合并與拼接

2、橫向合并

df_outer=pd.concat([left,right],axis=1,join='outer')#外鏈接
df_inner=pd.concat([left,right],axis=1,join='inner')#內(nèi)鏈接

python?pandas中如何實(shí)現(xiàn)合并與拼接

注意:因?yàn)閏oncat的鏈接和join一樣是通過索引來鏈接合并,并不能指定通過某個(gè)特定的列來鏈接進(jìn)行合并,所以看到的合并后的數(shù)據(jù)集left和right的編號(hào)和姓名是錯(cuò)位的。

如果要根據(jù)編號(hào)來關(guān)聯(lián)可以指定編號(hào)作為索引再進(jìn)行橫向合并,這樣就沒有問題了。

left.index=left['編號(hào)'].values
right.index=right['編號(hào)'].values
df_outer=pd.concat([left,right],axis=1,join='outer')
df_inner=pd.concat([left,right],axis=1,join='inner')

python?pandas中如何實(shí)現(xiàn)合并與拼接

四、append

df.append 可以將其他行附加到調(diào)用方的末尾,并返回一個(gè)新對(duì)象。它是最簡單常用的數(shù)據(jù)合并方式。語法如下:

df.append(self, other, ignore_index=False,verify_integrity=False, sort=False)

其中:

  • other 是它要追加的其他 DataFrame 或者類似序列內(nèi)容

  • ignore_index 如果為 True 則重新進(jìn)行自然索引

  • verify_integrity 如果為 True 則遇到重復(fù)索引內(nèi)容時(shí)報(bào)錯(cuò)

  • sort 進(jìn)行排序

來看下面的例子:

1、同結(jié)構(gòu)數(shù)據(jù)追加

將同結(jié)構(gòu)的數(shù)據(jù)追加在原數(shù)據(jù)后面,在left數(shù)據(jù)集后面追加left2數(shù)據(jù)集,left2的數(shù)據(jù)集內(nèi)容如下:

left2=pd.DataFrame([[1,'陳一'],[2,'周二']],columns=['編號(hào)','姓名'])
left2

python?pandas中如何實(shí)現(xiàn)合并與拼接

left.append(left2)

python?pandas中如何實(shí)現(xiàn)合并與拼接

2、不同結(jié)構(gòu)數(shù)據(jù)追加

不同結(jié)構(gòu)數(shù)據(jù)追加,原數(shù)據(jù)沒有的列會(huì)增加,沒有對(duì)應(yīng)內(nèi)容的會(huì)為空NaN。

如:left3的數(shù)據(jù)集列有"編號(hào)"、“姓名”、“工資”

left3=pd.DataFrame([[8,'孫八',10000],[9,'何九',15000]],columns=['編號(hào)','姓名','工資'])
left3

python?pandas中如何實(shí)現(xiàn)合并與拼接

left.append(left3)

python?pandas中如何實(shí)現(xiàn)合并與拼接

當(dāng)left后追加left3后的數(shù)據(jù)集會(huì)增加“工資列”,沒有對(duì)應(yīng)內(nèi)容的會(huì)為空。

3、追加合并多個(gè)數(shù)據(jù)集

append參數(shù)可帶數(shù)據(jù)集列表,可以將多個(gè)數(shù)據(jù)集追加到原數(shù)據(jù)集

如我們將left2和left3都追加到left

left.append([left2,left3])

python?pandas中如何實(shí)現(xiàn)合并與拼接

五、combine_first

combine_first可用于合并重復(fù)數(shù)據(jù),用其他數(shù)據(jù)集填充沒有的數(shù)據(jù)。如一個(gè)DataFrame數(shù)據(jù)集中出現(xiàn)了缺失數(shù)據(jù),就可以用其他DataFrame數(shù)據(jù)集中的數(shù)據(jù)進(jìn)行填充。語法格式如下:

combine_first(other) #只有一個(gè)參數(shù)other,該參數(shù)用于接收填充缺失值的DataFrame對(duì)象。

如left數(shù)據(jù)集中沒有"工資"的數(shù)據(jù),我們可以用right數(shù)據(jù)集有的數(shù)據(jù)去填充left數(shù)據(jù)集中的數(shù)據(jù)。

left.combine_first(right) #用right去填充left

python?pandas中如何實(shí)現(xiàn)合并與拼接

六、update

update和combine_first比較類似,區(qū)別在于:

1、填充合并方式稍有差異

combine_first:如果s1中c的值為空,用s2的值替換,否則保留s1的值

update:如果s2中的值不為空,那么替換s1,否則保留s1的值

2、update是更新原數(shù)據(jù),combine_first會(huì)返回一個(gè)填充后的新數(shù)據(jù)集,對(duì)原數(shù)據(jù)不做更新。

left.update(right) #用right的數(shù)據(jù)更新left中的數(shù)據(jù)。

python?pandas中如何實(shí)現(xiàn)合并與拼接

看完了這篇文章,相信你對(duì)“python pandas中如何實(shí)現(xiàn)合并與拼接”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI