<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在許多應用中,資料可能來自不同的渠道,在資料處理的過程中常常需要將這些資料集進行組合合併拼接,形成更加豐富的資料集。pandas提供了多種方法完全可以滿足資料處理的常用需求。具體來說包括有join、merge、concat、append等。
一般來說
方法 | 說明 |
---|---|
join | 最簡單,主要用於基於索引的橫向合併拼接 |
merge | 最常用,主要使用者基於指定列的橫向合併拼接 |
concat | 最強大,可用於橫向和縱向合併拼接 |
append | 主要用於縱向追加 |
combine_first | 合併重疊資料,填充缺失值 |
update | 將一個資料集的值更新到另一個資料集 |
下面就來逐一介紹每個方法
join主要用於基於索引的橫向合併拼接
在介紹pandas的join之前我們來看一下SQL對資料集join的幾種模式。如果大家對SQL比較熟悉的話應該對SQL運算元據集進行各種合併拼接印象深刻。SQL中各種JOIN的方法如下:
pandas的join實現了left join、right jion、inner join、out jion常用的4中join方法
來自官網的引數說明:
dataframe.join(other, # 待合併的另一個資料集 on=None, # 連線的鍵 how='left', # 連線方式:‘left', ‘right', ‘outer', ‘inner' 預設是left lsuffix='', # 左邊(第一個)資料集相同鍵的字尾 rsuffix='', # 第二個資料集的鍵的字尾 sort=False) # 是否根據連線的鍵進行排序;預設False
我們來看下範例,有兩個資料集一個是人員姓名,一個是人員的工資
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的資料集分別都指定了index,因為join主要用於基於索引的橫向合併拼接。
left.join(right) #預設how='left'
jion操作預設是left jion的操作,可以看到left索引為7姓名為錢七,在right中沒有索引為7的對應所以顯示left的姓名但right的工資為NaN,right中索引為8的資料在left中沒有索引為8的,所以沒有顯示。left join合併left的資料
left join 如下圖所示
left.join(right,how='right')
右連結合並時可以看到,left的資料集沒有索引為8的項,所以索引為8的項顯示right資料集的工資資料但姓名為NaN,在left中索引為7的項因為right中不存在,所以沒有顯示。right join合併right的資料
right join 如下圖所示
left.join(right,how='inner')
內連接合並時,可以看到left資料集中的索引為7姓名為錢七因為在right資料集中找不到對應的索引,right資料集中索引為8的在left找不到對應的索引所以內連線合併時索引7和8都沒有進行合併,inner join只合並兩個資料集共有的資料
inner join 如下圖所示
left.join(right,how='outer')
外連接合並時,可以看到不管是left中的資料還是right中的資料都進行了合併。right join合併兩個資料集中所有的資料。
outer join 如下圖所示
join很簡單,但是它有侷限性,因為它只能根據索引來合併。不能指定鍵來進行合併。比如我要根據編號和姓名來合併,join就比較難辦了。但是pandas提供了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)
引數名稱 | 說明 |
---|---|
left/right | 兩個不同的 DataFrame 物件。 |
on | 指定用於連線的鍵(即列標籤的名字),該鍵必須同時存在於左右兩個 DataFrame 中,如果沒有指定,並且其他引數也未指定, 那麼將會以兩個 DataFrame 的列名交集做為連線鍵。 |
left_on | 指定左側 DataFrame 中作連線鍵的列名。該引數在左、右列標籤名不相同,但表達的含義相同時非常有用。 |
right_on | 指定左側 DataFrame 中作連線鍵的列名。 |
left_index | 布林引數,預設為 False。如果為 True 則使用左側 DataFrame 的行索引作為連線鍵,若 DataFrame 具有多層索引(MultiIndex),則層的數量必須與連線鍵的數量相等。 |
right_index | 布林引數,預設為 False。如果為 True 則使用左側 DataFrame 的行索引作為連線鍵。 |
how | 要執行的合併型別,從 {‘left’, ‘right’, ‘outer’, ‘inner’} 中取值,預設為“inner”內連線。 |
sort | 布林值引數,預設為True,它會將合併後的資料進行排序;若設定為 False,則按照 how 給定的引數值進行排序。 |
suffixes | 字串組成的元組。當左右 DataFrame 存在相同列名時,通過該引數可以在相同的列名後附加字尾名,預設為(’_x’,’_y’)。 |
copy | 預設為 True,表示對資料進行復制。 |
我們來看下面的資料集,在上面的資料集中left資料集加入了員工的編號,right資料集加入了編號及姓名。索引就按預設的索引。
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內連線(取left和right編號和姓名的交集)
和join一樣通過how來指定連線方式如:
pd.merge(left,right,how='left')
how的連線方式和join一樣支援left、right、inner、outer
merge還可以指定多個列進行合併連結,也就是和SQL一樣設定多個關聯的列。
pd.merge(left,right,how='outer',on=['編號','姓名'])
如果兩個物件的列名不同,可以使用left_on,right_on分別指定,如我們把right資料集的“編碼”列標籤改成“ID”後如果需要left資料集的"編號"和right資料集的"ID"進行關聯
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已經很強大了,但是pandas願意給你更多,它提供了concat,可以實現橫向和縱向的合併與拼接。也就是說不但實現了SQL中的join還實現了union
concat() 函數用於沿某個特定的軸執行連線操作,語法如下:
pd.concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False)
引數名稱 | 說明 |
---|---|
objs | 一個序列或者是Series、DataFrame物件。 |
axis | 表示在哪個軸方向上(行或者列)進行連線操作,預設 axis=0 表示行方向。 |
join | 指定連線方式,取值為{“inner”,“outer”},預設為 outer 表示取並集,inner代表取交集。 |
ignore_index | 布林值引數,預設為 False,如果為 True,表示不在連線的軸上使用索引。 |
join_axes | 表示索引物件的列表。 |
來看具體的例子
left2=pd.DataFrame([[1,'陳一'],[2,'週二']],columns=['編號','姓名'])
concat預設縱向拼接,我們要在left1資料集的基礎上把left2資料集給合併上去,很簡單用concat直接就可以合併。
df=pd.concat([left,left2])
df_outer=pd.concat([left,right],axis=1,join='outer')#外連線 df_inner=pd.concat([left,right],axis=1,join='inner')#內連線
注意:因為concat的連結和join一樣是通過索引來連結合並,並不能指定通過某個特定的列來連結進行合併,所以看到的合併後的資料集left和right的編號和姓名是錯位的。
如果要根據編號來關聯可以指定編號作為索引再進行橫向合併,這樣就沒有問題了。
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')
df.append 可以將其他行附加到呼叫方的末尾,並返回一個新物件。它是最簡單常用的資料合併方式。語法如下:
df.append(self, other, ignore_index=False,verify_integrity=False, sort=False)
其中:
來看下面的例子:
將同結構的資料追加在原資料後面,在left資料集後面追加left2資料集,left2的資料集內容如下:
left2=pd.DataFrame([[1,'陳一'],[2,'週二']],columns=['編號','姓名']) left2
left.append(left2)
不同結構資料追加,原資料沒有的列會增加,沒有對應內容的會為空NaN。
如:left3的資料集列有"編號"、“姓名”、“工資”
left3=pd.DataFrame([[8,'孫八',10000],[9,'何九',15000]],columns=['編號','姓名','工資']) left3
left.append(left3)
當left後追加left3後的資料集會增加“工資列”,沒有對應內容的會為空。
append引數可帶資料集列表,可以將多個資料集追加到原資料集
如我們將left2和left3都追加到left
left.append([left2,left3])
combine_first可用於合併重複資料,用其他資料集填充沒有的資料。如一個DataFrame資料集中出現了缺失資料,就可以用其他DataFrame資料集中的資料進行填充。語法格式如下:
combine_first(other) #只有一個引數other,該引數用於接收填充缺失值的DataFrame物件。
如left資料集中沒有"工資"的資料,我們可以用right資料集有的資料去填充left資料集中的資料。
left.combine_first(right) #用right去填充left
update和combine_first比較類似,區別在於:
1、填充合併方式稍有差異
combine_first:如果s1中c的值為空,用s2的值替換,否則保留s1的值
update:如果s2中的值不為空,那麼替換s1,否則保留s1的值
2、update是更新原資料,combine_first會返回一個填充後的新資料集,對原資料不做更新。
left.update(right) #用right的資料更新left中的資料。
至此,本文介紹了pandas的多種資料合併與拼接方法,並介紹了每種方法的異同,通過pandas的資料處理可以應付日常資料處理中大部分的資料處理工作。
資料集及原始碼見:https://github.com/xiejava1018/pandastest.git
到此這篇關於python pandas資料處理教學之合併與拼接的文章就介紹到這了,更多相關pandas資料合併與拼接內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45