Pandas實現(xiàn)數(shù)據(jù)拼接的操作方法詳解
數(shù)據(jù)科學領域日常使用 Python 處理大規(guī)模數(shù)據(jù)集的時候經(jīng)常需要使用到合并、鏈接的方式進行數(shù)據(jù)集的整合,其中應用的數(shù)據(jù)類型包括 Series 和 DataFrame,可以使用的方法也很多,比如本文中介紹的 .merge()、 .join() 和 .concat() 三種方法,進行拼接處理后的數(shù)據(jù)集可以發(fā)揮最大的用途。
merge 操作
.merge() 方法是用于組合通用列或索引上的數(shù)據(jù),這個方法有點類似于 MySQL 中的 join 操作,可以實現(xiàn)左拼接、右拼接、全連接等操作。
通過關鍵字的索引進行拼接,實現(xiàn)多對一、一對多、多對多(笛卡爾乘積)連接。
merge 中參數(shù)解釋:
- how:定義合并方式,選擇參數(shù)有 『inner』,『outer』, 『left’』,『right』。
- on:定義2個 DataFrame 中都必須包含的列用于連接(索引鍵)。
- left_on 和 right_on:指定要合并的左側(cè)或右側(cè)對象中存在的列或索引。
- left_index 和 right_index:默認為 False,設置為以索引列作為合并基準。
- suffixes:字符串元組,用于附加到不是合并鍵的相同列名。
merge 拼接方式
一張圖就能看明白不同關鍵字參數(shù) merger 的方式。
merge 舉例
數(shù)據(jù)讀取
我們要進行勢力所屬和人物直接關系的拼接操作,讀取的數(shù)據(jù)包括下面的2個列表,并將 人物歷史登入數(shù)據(jù) 中沒有勢力的數(shù)據(jù)剔除。
import pandas as pd country = pd.read_excel("Romance of the Three Kingdoms 13/勢力列表.xlsx") people = pd.read_excel("Romance of the Three Kingdoms 13/人物歷史登入數(shù)據(jù).xlsx") # 剔除不包含的勢力數(shù)據(jù),即武將在野的狀態(tài) people = people[people["勢力"]!="-"] country.head()
people.head()
內(nèi)部聯(lián)接
使用 merge 默認參數(shù)可以直接進行內(nèi)部連接,匹配兩個DataFrame交集的結(jié)果。
將人物和所屬勢力進行一個拼接,這里我們?nèi)〉氖沁@個人物最終歸屬的勢力,即改人物數(shù)據(jù)聚合后的最后一條數(shù)據(jù)信息。
people_new = people.groupby('名前').nth(-1) people_new["名前"] = people_new.index people_new.reset_index(drop=True,inplace=True) people_new
merge 中DataFrame的順序決定了拼接結(jié)果的順序。
inner_merged_total = pd.merge(country,people_new,on=["勢力"]) inner_merged_total.head()
inner_merged_total = pd.merge(people_new,country,on=["勢力"]) inner_merged_total.head()
外連接
外連接(也稱為完全外連接)中,來自兩個 DataFrame 的所有行都將出現(xiàn)在新的 DataFrame 中。
本質(zhì)上對于數(shù)據(jù)全的 df_A 和包含的 df_B 進行 outer 拼接,相當于 pd.merge(df_A ,df_B,on=[“key”])。
outer_merged = pd.merge(people_new,country,how="outer",on=["勢力"]) outer_merged.head()
如果我們不剔除在野武將的數(shù)據(jù)的話會發(fā)現(xiàn)是整張表單進行拼接。
country = pd.read_excel("Romance of the Three Kingdoms 13/勢力列表.xlsx") people = pd.read_excel("Romance of the Three Kingdoms 13/人物歷史登入數(shù)據(jù).xlsx") outer_merged = pd.merge(people_new,country,how="outer",on=["勢力"]) outer_merged
左連接
新合并的 DataFrame 與左側(cè) DataFrame 中的所有行一起保留(即merge中的第一個dataframe),同時丟棄右側(cè) DataFrame 中在左側(cè) DataFrame 的鍵列中沒有匹配的行。
left_merged = pd.merge(people_new,country,how="left",on=["勢力"]) left_merged
右連接
新合并的 DataFrame 與右側(cè) DataFrame 中的所有行一起保留(即merge中的第二個dataframe),同時丟棄右側(cè) DataFrame 中在左側(cè) DataFrame 的鍵列中沒有匹配的行。
right_merged = pd.merge(people_new,country,how="right",on=["勢力"]) right_merged
join 操作
join 操作和 merge 很相似,是在列或索引上組合數(shù)據(jù),join 相當于指定了 merge 中的第一個 DataFreme 。并且命名沖突的列可以定義后綴進行重新命名。
這個結(jié)果和之前的左右 merger 很相似。
join 中參數(shù)解釋:
- other:定義要拼接的 DataFrame。
- on:指定左側(cè) DataFrame 的可選列或索引名稱。如果設置為 None,這是默認 index 連接。
- how:與 merge 中的 how 具有相同,如果不指定列則使用索引拼接。
- lsuffix 和 rsuffix:類似 merge() 中的后綴。
- sort:對生成后的 DataFrame 進行排序。
join 舉例
people_new.join(country, lsuffix="left", rsuffix="right")
僅僅是index的橫向拼接。
concat 操作
concat 操作起來就比較靈活,可以進行橫向的拼接操作,也可以進行縱向的拼接操作。
縱向拼接操作
橫拼接操作
concat 中參數(shù)解釋:
- objs:要連接的任何數(shù)據(jù)對象。可以是List,Serices,DataFrame,Dict 等等。
- axis:連接的軸。默認值為0(行軸),1(縱直)連接。
- join:類似于 merger 中的 how 參數(shù),只接受值 inner 或 outer 。
- ignore_index:默認為False。True 為設置新的組合數(shù)據(jù)集將不會保留 axis 參數(shù)中指定的軸中的原始索引值。
- keys:構(gòu)建分層索引,用于查詢不同的行來自的原始數(shù)據(jù)集。
- copy:是否要復制源數(shù)據(jù),默認值為True。
concat 舉例
我們使用三國的寶物數(shù)據(jù)來觀察,數(shù)據(jù) 74 行。
import pandas as pd items = pd.read_excel("Romance of the Three Kingdoms 13/道具列表.xlsx") items.head()
橫向拼接后,保持數(shù)據(jù)最大行數(shù) 74。
pd.concat([items, items], axis=1)
縱向拼接后,最大行數(shù)變成 74 的 2倍。
pd.concat([items, items], axis=0)
append 舉例
append 也是 DataFrame 數(shù)據(jù)進行拼接的有效方式,方式同 concat 的縱向拼接,返回的結(jié)果需要對變量重新定義才能生效。
注意下面2個 append 行數(shù)的區(qū)別
items.append(items) items
items = items.append(items) items
到此這篇關于Pandas實現(xiàn)數(shù)據(jù)拼接的操作方法詳解的文章就介紹到這了,更多相關Pandas數(shù)據(jù)拼接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python將list中的string批量轉(zhuǎn)化成int/float的方法
今天小編就為大家分享一篇Python將list中的string批量轉(zhuǎn)化成int/float的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06python list中append()與extend()用法分享
列表是以類的形式實現(xiàn)的。“創(chuàng)建”列表實際上是將一個類實例化。因此,列表有多種方法可以操作2013-03-03python中str內(nèi)置函數(shù)用法總結(jié)
在本篇文章里小編給大家整理了一篇關于python中str內(nèi)置函數(shù)用法總結(jié)內(nèi)容,有需要的朋友們可以學習下。2020-12-12Pytorch的torch.utils.data中Dataset以及DataLoader示例詳解
torch.utils.data?是?PyTorch?提供的一個模塊,用于處理和加載數(shù)據(jù),該模塊提供了一系列工具類和函數(shù),用于創(chuàng)建、操作和批量加載數(shù)據(jù)集,這篇文章主要介紹了Pytorch的torch.utils.data中Dataset以及DataLoader等詳解,需要的朋友可以參考下2023-08-08Python Dataframe 指定多列去重、求差集的方法
今天小編就為大家分享一篇Python Dataframe 指定多列去重、求差集的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07