python?pandas數(shù)據(jù)處理教程之合并與拼接
前言
在許多應用中,數(shù)據(jù)可能來自不同的渠道,在數(shù)據(jù)處理的過程中常常需要將這些數(shù)據(jù)集進行組合合并拼接,形成更加豐富的數(shù)據(jù)集。pandas提供了多種方法完全可以滿足數(shù)據(jù)處理的常用需求。具體來說包括有join、merge、concat、append等。
一般來說
方法 | 說明 |
---|---|
join | 最簡單,主要用于基于索引的橫向合并拼接 |
merge | 最常用,主要用戶基于指定列的橫向合并拼接 |
concat | 最強大,可用于橫向和縱向合并拼接 |
append | 主要用于縱向追加 |
combine_first | 合并重疊數(shù)據(jù),填充缺失值 |
update | 將一個數(shù)據(jù)集的值更新到另一個數(shù)據(jù)集 |
下面就來逐一介紹每個方法
一、join
join主要用于基于索引的橫向合并拼接
在介紹pandas的join之前我們來看一下SQL對數(shù)據(jù)集join的幾種模式。如果大家對SQL比較熟悉的話應該對SQL操作數(shù)據(jù)集進行各種合并拼接印象深刻。SQL中各種JOIN的方法如下:
pandas的join實現(xiàn)了left join、right jion、inner join、out jion常用的4中join方法
來自官網(wǎng)的參數(shù)說明:
dataframe.join(other, # 待合并的另一個數(shù)據(jù)集 on=None, # 連接的鍵 how='left', # 連接方式:‘left', ‘right', ‘outer', ‘inner' 默認是left lsuffix='', # 左邊(第一個)數(shù)據(jù)集相同鍵的后綴 rsuffix='', # 第二個數(shù)據(jù)集的鍵的后綴 sort=False) # 是否根據(jù)連接的鍵進行排序;默認False
我們來看下實例,有兩個數(shù)據(jù)集一個是人員姓名,一個是人員的工資
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=['工資'])
注意,left和right的數(shù)據(jù)集分別都指定了index,因為join主要用于基于索引的橫向合并拼接。
1、left join
left.join(right) #默認how='left'
jion操作默認是left jion的操作,可以看到left索引為7姓名為錢七,在right中沒有索引為7的對應所以顯示left的姓名但right的工資為NaN,right中索引為8的數(shù)據(jù)在left中沒有索引為8的,所以沒有顯示。left join合并left的數(shù)據(jù)
left join 如下圖所示
2、right join
left.join(right,how='right')
右鏈接合并時可以看到,left的數(shù)據(jù)集沒有索引為8的項,所以索引為8的項顯示right數(shù)據(jù)集的工資數(shù)據(jù)但姓名為NaN,在left中索引為7的項因為right中不存在,所以沒有顯示。right join合并right的數(shù)據(jù)
right join 如下圖所示
3、inner join
left.join(right,how='inner')
內(nèi)鏈接合并時,可以看到left數(shù)據(jù)集中的索引為7姓名為錢七因為在right數(shù)據(jù)集中找不到對應的索引,right數(shù)據(jù)集中索引為8的在left找不到對應的索引所以內(nèi)連接合并時索引7和8都沒有進行合并,inner join只合并兩個數(shù)據(jù)集共有的數(shù)據(jù)
inner join 如下圖所示
4、out join
left.join(right,how='outer')
外鏈接合并時,可以看到不管是left中的數(shù)據(jù)還是right中的數(shù)據(jù)都進行了合并。right join合并兩個數(shù)據(jù)集中所有的數(shù)據(jù)。
outer join 如下圖所示
join很簡單,但是它有局限性,因為它只能根據(jù)索引來合并。不能指定鍵來進行合并。比如我要根據(jù)編號和姓名來合并,join就比較難辦了。但是pandas提供了merge的方法,可以指定列來進行合并拼接。
二、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 | 兩個不同的 DataFrame 對象。 |
on | 指定用于連接的鍵(即列標簽的名字),該鍵必須同時存在于左右兩個 DataFrame 中,如果沒有指定,并且其他參數(shù)也未指定, 那么將會以兩個 DataFrame 的列名交集做為連接鍵。 |
left_on | 指定左側 DataFrame 中作連接鍵的列名。該參數(shù)在左、右列標簽名不相同,但表達的含義相同時非常有用。 |
right_on | 指定左側 DataFrame 中作連接鍵的列名。 |
left_index | 布爾參數(shù),默認為 False。如果為 True 則使用左側 DataFrame 的行索引作為連接鍵,若 DataFrame 具有多層索引(MultiIndex),則層的數(shù)量必須與連接鍵的數(shù)量相等。 |
right_index | 布爾參數(shù),默認為 False。如果為 True 則使用左側 DataFrame 的行索引作為連接鍵。 |
how | 要執(zhí)行的合并類型,從 {‘left’, ‘right’, ‘outer’, ‘inner’} 中取值,默認為“inner”內(nèi)連接。 |
sort | 布爾值參數(shù),默認為True,它會將合并后的數(shù)據(jù)進行排序;若設置為 False,則按照 how 給定的參數(shù)值進行排序。 |
suffixes | 字符串組成的元組。當左右 DataFrame 存在相同列名時,通過該參數(shù)可以在相同的列名后附加后綴名,默認為(’_x’,’_y’)。 |
copy | 默認為 True,表示對數(shù)據(jù)進行復制。 |
我們來看下面的數(shù)據(jù)集,在上面的數(shù)據(jù)集中l(wèi)eft數(shù)據(jù)集加入了員工的編號,right數(shù)據(jù)集加入了編號及姓名。索引就按默認的索引。
left=pd.DataFrame([[3,'張三'],[4,'李四'],[5,'王五'],[6,'趙六'],[7,'錢七']], columns=['編號','姓名']) right=pd.DataFrame([[3,'張三',13000],[4,'李四',15000],[5,'王五',9000],[6,'趙六',8600],[8,'孫八',10000]], columns=['編號','姓名','工資'])
pd.merge(left,right)
沒有指定連接鍵,默認用重疊列名,沒有指定連接方式,默認inner內(nèi)連接(取left和right編號和姓名的交集)
和join一樣通過how來指定連接方式如:
pd.merge(left,right,how='left')
how的連接方式和join一樣支持left、right、inner、outer
merge還可以指定多個列進行合并鏈接,也就是和SQL一樣設置多個關聯(lián)的列。
pd.merge(left,right,how='outer',on=['編號','姓名'])
如果兩個對象的列名不同,可以使用left_on,right_on分別指定,如我們把right數(shù)據(jù)集的“編碼”列標簽改成“ID”后如果需要left數(shù)據(jù)集的"編號"和right數(shù)據(jù)集的"ID"進行關聯(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='編號',right_on='ID')
雖然說merge已經(jīng)很強大了,但是pandas愿意給你更多,它提供了concat,可以實現(xiàn)橫向和縱向的合并與拼接。也就是說不但實現(xiàn)了SQL中的join還實現(xiàn)了union
三、concat
concat() 函數(shù)用于沿某個特定的軸執(zhí)行連接操作,語法如下:
pd.concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False)
參數(shù)名稱 | 說明 |
---|---|
objs | 一個序列或者是Series、DataFrame對象。 |
axis | 表示在哪個軸方向上(行或者列)進行連接操作,默認 axis=0 表示行方向。 |
join | 指定連接方式,取值為{“inner”,“outer”},默認為 outer 表示取并集,inner代表取交集。 |
ignore_index | 布爾值參數(shù),默認為 False,如果為 True,表示不在連接的軸上使用索引。 |
join_axes | 表示索引對象的列表。 |
來看具體的例子
left2=pd.DataFrame([[1,'陳一'],[2,'周二']],columns=['編號','姓名'])
1、縱向合并
concat默認縱向拼接,我們要在left1數(shù)據(jù)集的基礎上把left2數(shù)據(jù)集給合并上去,很簡單用concat直接就可以合并。
df=pd.concat([left,left2])
2、橫向合并
df_outer=pd.concat([left,right],axis=1,join='outer')#外鏈接 df_inner=pd.concat([left,right],axis=1,join='inner')#內(nèi)鏈接
注意:因為concat的鏈接和join一樣是通過索引來鏈接合并,并不能指定通過某個特定的列來鏈接進行合并,所以看到的合并后的數(shù)據(jù)集left和right的編號和姓名是錯位的。
如果要根據(jù)編號來關聯(lián)可以指定編號作為索引再進行橫向合并,這樣就沒有問題了。
left.index=left['編號'].values right.index=right['編號'].values df_outer=pd.concat([left,right],axis=1,join='outer') df_inner=pd.concat([left,right],axis=1,join='inner')
四、append
df.append 可以將其他行附加到調(diào)用方的末尾,并返回一個新對象。它是最簡單常用的數(shù)據(jù)合并方式。語法如下:
df.append(self, other, ignore_index=False,verify_integrity=False, sort=False)
其中:
- other 是它要追加的其他 DataFrame 或者類似序列內(nèi)容
- ignore_index 如果為 True 則重新進行自然索引
- verify_integrity 如果為 True 則遇到重復索引內(nèi)容時報錯
- sort 進行排序
來看下面的例子:
1、同結構數(shù)據(jù)追加
將同結構的數(shù)據(jù)追加在原數(shù)據(jù)后面,在left數(shù)據(jù)集后面追加left2數(shù)據(jù)集,left2的數(shù)據(jù)集內(nèi)容如下:
left2=pd.DataFrame([[1,'陳一'],[2,'周二']],columns=['編號','姓名']) left2
left.append(left2)
2、不同結構數(shù)據(jù)追加
不同結構數(shù)據(jù)追加,原數(shù)據(jù)沒有的列會增加,沒有對應內(nèi)容的會為空NaN。
如:left3的數(shù)據(jù)集列有"編號"、“姓名”、“工資”
left3=pd.DataFrame([[8,'孫八',10000],[9,'何九',15000]],columns=['編號','姓名','工資']) left3
left.append(left3)
當left后追加left3后的數(shù)據(jù)集會增加“工資列”,沒有對應內(nèi)容的會為空。
3、追加合并多個數(shù)據(jù)集
append參數(shù)可帶數(shù)據(jù)集列表,可以將多個數(shù)據(jù)集追加到原數(shù)據(jù)集
如我們將left2和left3都追加到left
left.append([left2,left3])
五、combine_first
combine_first可用于合并重復數(shù)據(jù),用其他數(shù)據(jù)集填充沒有的數(shù)據(jù)。如一個DataFrame數(shù)據(jù)集中出現(xiàn)了缺失數(shù)據(jù),就可以用其他DataFrame數(shù)據(jù)集中的數(shù)據(jù)進行填充。語法格式如下:
combine_first(other) #只有一個參數(shù)other,該參數(shù)用于接收填充缺失值的DataFrame對象。
如left數(shù)據(jù)集中沒有"工資"的數(shù)據(jù),我們可以用right數(shù)據(jù)集有的數(shù)據(jù)去填充left數(shù)據(jù)集中的數(shù)據(jù)。
left.combine_first(right) #用right去填充left
六、update
update和combine_first比較類似,區(qū)別在于:
1、填充合并方式稍有差異
combine_first:如果s1中c的值為空,用s2的值替換,否則保留s1的值
update:如果s2中的值不為空,那么替換s1,否則保留s1的值
2、update是更新原數(shù)據(jù),combine_first會返回一個填充后的新數(shù)據(jù)集,對原數(shù)據(jù)不做更新。
left.update(right) #用right的數(shù)據(jù)更新left中的數(shù)據(jù)。
至此,本文介紹了pandas的多種數(shù)據(jù)合并與拼接方法,并介紹了每種方法的異同,通過pandas的數(shù)據(jù)處理可以應付日常數(shù)據(jù)處理中大部分的數(shù)據(jù)處理工作。
數(shù)據(jù)集及源代碼見:https://github.com/xiejava1018/pandastest.git
總結
到此這篇關于python pandas數(shù)據(jù)處理教程之合并與拼接的文章就介紹到這了,更多相關pandas數(shù)據(jù)合并與拼接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
DataFrame窗口函數(shù)rolling()的用法
這篇文章主要介紹了DataFrame窗口函數(shù)rolling()的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02tensor.squeeze函數(shù)和tensor.unsqueeze函數(shù)的使用詳解
本文主要介紹了tensor.squeeze函數(shù)和tensor.unsqueeze函數(shù)的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03python爬蟲_實現(xiàn)校園網(wǎng)自動重連腳本的教程
下面小編就為大家分享一篇python爬蟲_實現(xiàn)校園網(wǎng)自動重連腳本的教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Django Admin后臺添加數(shù)據(jù)庫視圖過程解析
這篇文章主要介紹了Django Admin后臺添加數(shù)據(jù)庫視圖過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04Python實現(xiàn)從SQL型數(shù)據(jù)庫讀寫dataframe型數(shù)據(jù)的方法【基于pandas】
這篇文章主要介紹了Python實現(xiàn)從SQL型數(shù)據(jù)庫讀寫dataframe型數(shù)據(jù)的方法,涉及Python基于pandas的數(shù)據(jù)庫讀寫相關操作技巧,需要的朋友可以參考下2019-03-03