Python之數據合并——【concat()函數、merge()函數、join()方法、combine_first()方法】

文章目錄

  • 軸向堆疊數據——concat()函數
    • 橫向堆疊與外連接
    • 縱向堆疊與內連接
  • 主鍵合并數據——merge()函數
    • 內連接方式
    • 外連接方式
    • 左連接方式
    • 右連接方式
    • 其他
  • 根據行索引合并數據——join()方法
    • 四種連接方式
    • 行索引與列索引重疊
  • 合并重疊數據——combine_first()方法


軸向堆疊數據——concat()函數

pandas.concat(
objs: Union[
Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
],
axis=0,
join=“outer”,
ignore_index: bool = False,
keys=None,
levels=None,
names=None,
verify_integrity: bool = False,
sort: bool = False,
copy: bool = True,
)

上述函數中常用參數表示的含義如下:

join:表示連接的方式,inner表示內連接,outer表示外連接,默認使用外連接。

ignore_index:接受布爾值,默認為False。如果設置為True,則表示清除現有索引并重置索引值。

keys:接受序列,表示添加最外層索引。

levels:用于構建MultiIndex的特定級別(唯一值)

names:在設置了keys和levels參數后,用于創建分層級別的名稱

verify_integerity:檢查新的連接軸是否包含重復項。接收布爾值,當設置為True時,如果有重復的軸將會拋出錯誤,默認為False


根據軸方向的不同(axis參數),可以將堆疊分成橫向堆疊和縱向堆疊默認采用的是縱向堆疊方式。在堆疊數據時,默認采用的是外連接,(join參數設為outer)的方式。

橫向堆疊與外連接

使用concat()函數合并時,若是將axis參數的值設為1,且join參數的值設為outer,則合并方式為橫向堆疊與外連接。

測試對象:

left:A   B
a  A0  B0
b  A1  B1
right:C   D
c  C0  D0
d  C1  D1

代碼:

left = pd.DataFrame({'A': ['A0', 'A1'],'B': ['B0', 'B1']},index=['a', 'b'])
right = pd.DataFrame({'C': ['C0', 'C1'],'D': ['D0', 'D1']},index=['c', 'd'])
print(pd.concat([left, right], join='outer', axis=1))

輸出結果:

     A    B    C    D
a   A0   B0  NaN  NaN
b   A1   B1  NaN  NaN
c  NaN  NaN   C0   D0
d  NaN  NaN   C1   D1

使用concat()函數合并之后產生的不存在的數據將用NaN進行填充。


縱向堆疊與內連接

使用concat()函數合并時,若是將axis參數的值設為0,且join參數的值設為inner,則合并方式為縱向堆疊與內連接。

測試對象:

df1:A   B   C
0  A0  B0  C0
1  A1  B1  C1
2  A2  B2  C2
df2:B   C   D
0  B3  C3  D3
1  B4  C4  D4
2  B5  C5  D5

代碼:

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2'],'C': ['C0', 'C1', 'C2']})
df2 = pd.DataFrame({'B': ['B3', 'B4', 'B5'],'C': ['C3', 'C4', 'C5'],'D': ['D3', 'D4', 'D5']})
print(pd.concat([df1, df2], join='inner', axis=0))

輸出結果

    B   C
0  B0  C0
1  B1  C1
2  B2  C2
0  B3  C3
1  B4  C4
2  B5  C5

主鍵合并數據——merge()函數

主鍵合并根據一個多個鍵將不同的DaraFrame對象連接起來,大多數是將兩個DataFrame對象中重疊作為合并的鍵。

merge(
left,
right,
how: str = “inner”,
on=None,
left_on=None,
right_on=None,
left_index: bool = False,
right_index: bool = False,
sort: bool = False,
suffixes=("_x", “_y”),
copy: bool = True,
indicator: bool = False,
validate=None,
)

上述函數中部分參數表示的含義如下:

  1. left:參與合并的的左側DataFrame對象
  2. right:參與合并的的右側DataFrame對象
  3. how:表示連接方式,默認為inner,該參數支持以下的取值:
    · left:使用左側的DataFrame的鍵,類似于SQL的左外連接
    · right:使用右側的DataFrame的鍵,類似于SQL的右外連接
    · outer:使用兩個DataFrame所有的鍵,類似于SQL的全連接
    · inner:使用兩個DataFrame鍵的交集,類似于SQL的內連接
  4. on:用于連接的列名。必須存在于左右兩個DataFrame對象中
  5. left_on:以左側的DataFrame作為連接鍵
  6. right_on:以右側的DataFrame作為連接鍵
  7. left_index:左側的行索引用作連接鍵
  8. right_index:右側的行索引用作連接鍵
  9. sort:是否排序,接受布爾值,默認為False
  10. suffixes:用于追加都重疊列名的末尾,默認為(_x,_y)

內連接方式

默認采用how=inner的方式合并

測試對象:

df1:A   B   C
0  A0  B0  C0
1  A1  B1  C1
2  A2  B2  C2
df3:B   C   D
0  B0  C0  D3
1  B2  C2  D4
2  B4  C4  D5

代碼:

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2'],'C': ['C0', 'C1', 'C2']})
df3 = pd.DataFrame({'B': ['B0', 'B2', 'B4'],'C': ['C0', 'C2', 'C4'],'D': ['D3', 'D4', 'D5']})
print("pd.merge:\n", pd.merge(df1, df3, on=['B', 'C']))

輸出結果:

pd.merge:A   B   C   D
0  A0  B0  C0  D3
1  A2  B2  C2  D4

外連接方式

外連接方式(how=outer):left與right列中相同的數據將會重疊,沒有數據的位置使用NaN進行填充。

測試對象:

df1:A   B   C
0  A0  B0  C0
1  A1  B1  C1
2  A2  B2  C2
df3:B   C   D
0  B0  C0  D3
1  B2  C2  D4
2  B4  C4  D5

代碼:

print("pd.merge(how=outer):\n", pd.merge(df1, df3, on=['B', 'C'], how='outer'))

輸出結果:

pd.merge(how=outer):A   B   C    D
0   A0  B0  C0   D3
1   A1  B1  C1  NaN
2   A2  B2  C2   D4
3  NaN  B4  C4   D5

左連接方式

左連接方式(how=left):以左表作為基準進行連接,left表中的數據會全部顯示,right表中只會顯示與重疊數據行索引值相同的數據,合并后表中缺失的數據會使用NaN進行填充。

測試對象:

df1:A   B   C
0  A0  B0  C0
1  A1  B1  C1
2  A2  B2  C2
df3:B   C   D
0  B0  C0  D3
1  B2  C2  D4
2  B4  C4  D5

代碼:

print("pd.merge(how=left):\n", pd.merge(df1, df3, on=['B', 'C'], how='left'))

輸出結果:

pd.merge(how=left):A   B   C    D
0  A0  B0  C0   D3
1  A1  B1  C1  NaN
2  A2  B2  C2   D4

右連接方式

右連接方式(how=left):以右表作為基準進行連接,right表中的數據會全部顯示,left表中只會顯示與重疊數據行索引值相同的數據,合并后表中缺失的數據會使用NaN進行填充。

測試對象:

df1:A   B   C
0  A0  B0  C0
1  A1  B1  C1
2  A2  B2  C2
df3:B   C   D
0  B0  C0  D3
1  B2  C2  D4
2  B4  C4  D5

代碼:

print("pd.merge(how=right):\n", pd.merge(df1, df3, on=['B', 'C'], how='right'))

測試結果:

pd.merge(how=right):A   B   C   D
0   A0  B0  C0  D3
1   A2  B2  C2  D4
2  NaN  B4  C4  D5

其他

即使兩張表中的行索引與列索引均沒有重疊的部分,也可以使用merge()函數來合并。只需要將參數left_index和right_index的值設置為True即可。

測試對象

left:A   B
a  A0  B0
b  A1  B1
right:C   D
c  C0  D0
d  C1  D1

代碼:

print("pd.merge(left_index=right_index=True):\n",pd.merge(left, right, how='outer', left_index=True, right_index=True))

輸出結果:

      A    B    C    D
a   A0   B0  NaN  NaN
b   A1   B1  NaN  NaN
c  NaN  NaN   C0   D0
d  NaN  NaN   C1   D1

根據行索引合并數據——join()方法

join(self, other, on=None, how=“left”, lsuffix="", rsuffix="", sort=False)

上述方法常用參數表示的含義如下:

  1. on:用于連接列名
  2. how:可從{‘left’,‘right’,‘outer’,‘inner’}中任選一個,默認使用left的方式
  3. lsuffix:接受字符串,用于在左側重疊的列名后添加后綴名
  4. rsuffix:接受字符串,用于在右側重疊的列名后添加后綴名
  5. sort:接受布爾值,根據連接鍵對合并的數據進行排序,默認為False

四種連接方式

測試對象:

data1:A   B   C
a  A0  B0  C0
b  A1  B1  C1
c  A2  B2  C2
data2:B   C   D
b  B1  C1  D1
c  B2  C2  D2
d  B3  C3  D3

代碼:

data1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2'],'C': ['C0', 'C1', 'C2']},index=['a', 'b', 'c'])
data2 = pd.DataFrame({'B': ['B1', 'B2', 'B3'],'C': ['C1', 'C2', 'C3'],'D': ['D1', 'D2', 'D3']},index=['b', 'c', 'd'])
print("data1.join(data2, how='outer', lsuffix='one'):\n",data1.join(data2, how='outer', lsuffix='one'))
print("data1.join(data2, how='inner', rsuffix='two'):\n", 
data1.join(data2, how='inner', rsuffix='two'))
print("data1.join(data2, how='left', lsuffix='one'):\n", 
data1.join(data2, how='left', lsuffix='one'))
print("data1.join(data2, how='right', rsuffix='two'):\n", 
data1.join(data2, how='right', rsuffix='two'))

輸出結果:

data1.join(data2, how='outer', lsuffix='one'):A Bone Cone    B    C    D
a   A0   B0   C0  NaN  NaN  NaN
b   A1   B1   C1   B1   C1   D1
c   A2   B2   C2   B2   C2   D2
d  NaN  NaN  NaN   B3   C3   D3
data1.join(data2, how='inner', rsuffix='two'):A   B   C Btwo Ctwo   D
b  A1  B1  C1   B1   C1  D1
c  A2  B2  C2   B2   C2  D2
data1.join(data2, how='left', lsuffix='one'):A Bone Cone    B    C    D
a  A0   B0   C0  NaN  NaN  NaN
b  A1   B1   C1   B1   C1   D1
c  A2   B2   C2   B2   C2   D2
data1.join(data2, how='right', rsuffix='two'):A    B    C Btwo Ctwo   D
b   A1   B1   C1   B1   C1  D1
c   A2   B2   C2   B2   C2  D2
d  NaN  NaN  NaN   B3   C3  D3

行索引與列索引重疊

測試對象:

join1:A   B key
0  A0  B0  K0
1  A1  B1  K1
2  A2  B2  K2
join2:C   D
K0  C0  D0
K1  C1  D1
K2  C2  D2

代碼:

join1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2'],'key': ['K0', 'K1', 'K2']})
join2 = pd.DataFrame({'C': ['C0', 'C1', 'C2'],'D': ['D0', 'D1', 'D2']},index=['K0', 'K1', 'K2'])
print("join1.join(join2, on='key'):\n", join1.join(join2, on='key'))

輸出結果:

join1.join(join2, on='key'):A   B key   C   D
0  A0  B0  K0  C0  D0
1  A1  B1  K1  C1  D1
2  A2  B2  K2  C2  D2

合并重疊數據——combine_first()方法

使用combine_first()方法合并兩個DataFrame對象時,必須確保它們的行索引和列索引有重疊的部分。

combine_first(self, other: “DataFrame”)

上述方法中只有一個參數other,該參數用于接收填充缺失值的DataFrame對象。

測試對象:

test1:A    B
0  NaN   B0
1   A1  NaN
2   A2   B2
3   A3  NaN
test2:A   B
1  C0  D0
0  C1  D1
2  C2  D2

代碼:

test1 = pd.DataFrame({'A': [np.nan, 'A1', 'A2', 'A3'],'B': ['B0', np.nan, 'B2', np.nan]})
test2 = pd.DataFrame({'A': ['C0', 'C1', 'C2'],'B': ['D0', 'D1', 'D2']},index=[1, 0, 2])
print("test1.combine_first(test2):\n", test1.combine_first(test2))

輸出結果:

test1.combine_first(test2):A    B
0  C1   B0
1  A1   D0
2  A2   B2
3  A3  NaN

從上可知,盡管test2表中的行索引與test1表的行索引順序不同,當用test2表的數據替換test1表的NaN值時,替換數據與缺失數據的索引位置仍然是相同的。例如,test1表中位于第0行第A列的“NaN”需要使用test2表中相同位置的數據“C1"來替換。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443855.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443855.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443855.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

超硬核!操作系統學霸筆記,考試復習面試全靠它

之后會發布基于基礎知識的大部分算法的模擬代碼合集,敬請關注。 進程基礎 進程的基本概念 程序順序執行的特征: 1)順序性:處理機嚴格按照程序所規定的順序執行,每一步操作必須在下一步操作開始前執行 2)封…

配置tomcat6.0的HTTPS(單向)

利用JDK自帶的產生證書的工具 生成證書 建立一個腳本文件,內容如下: set SERVER_DN"CNServer, OUshare, Oshare, Lsz, Sgd, CCN" set CLIENT_DN"CNClient, OUshare, Oshare, Lsz, Sgd, CCN" set KS_PASS-storepass changeit set KE…

Python之數據重塑——【stack()方法和unstack()方法、pivot()方法】

文章目錄重塑層次化索引對于單層索引的DataFrame類對象stack()方法unstack()方法對于多層索引的DataFrame類對象辨析操作內層索引與外層索引的區別查看多層索引對象轉換后的類型軸向旋轉——pivot()方法重塑層次化索引 Pandas中重塑層次化索引的操作主要是stack()方法和unstac…

超硬核!學霸把操作系統經典算法給敲完了!要知行合一

上期的筆記,瀏覽快1萬了,既然關注的人很多,那就發出來承諾過的算法全模擬,希望幫到你們。 上期的操作系統學霸筆記,考試復習面試全靠它 一、模擬進程調度 功能 data.h #ifndef _Data_h_ #define _Data_h_#include …

Python之數據轉換——【rename()方法、cut()函數、get_dummies()函數】

文章目錄重命名軸索引離散化連續數據啞變量處理類別型數據重命名軸索引 rename( self, mapper: Optional[Renamer] None, *, index: Optional[Renamer] None, columns: Optional[Renamer] None, axis: Optional[Axis] None, copy: bool True, inplace: bool False, level…

超硬核!數據結構學霸筆記,考試面試吹牛就靠它

上次發操作系統筆記,很快瀏覽上萬,這次數據結構比上次硬核的多哦,同樣的會發超硬核代碼,關注吧。 超硬核!操作系統學霸筆記,考試復習面試全靠它 第一次筆記(復習c,課程概述&#xff…

Python之數據拆分——groupby()方法

文章目錄groupby()方法通過列名進行分組通過Series對象進行分組Series對象與原數據的行索引長度相等Series對象與原數據的行索引長度不等通過字典進行分組按照columns軸的方向進行分組按照index軸的方向進行分組通過函數進行分組groupby()方法 groupby( self, byNone, axis0, l…

超硬核!小白讀了這篇文章,就能在算法圈混了

作為一只超級硬核的兔子,從來不給你說廢話,只有最有用的干貨!這些神級算法送給你 目錄 第一節 1.1bogo排序 1.2位運算 1.3打擂臺 1.4morris遍歷 第二節 2.1睡眠排序 2.2會死的兔子 2.3矩陣快速冪 2.4摔手機/摔雞蛋 時空復雜度目錄 …

Python之數據聚合——aggregate()方法

文章目錄使用內置統計方法聚合數據面向列的聚合方法aggregate()方法對每一列數據應用同一個函數對某列數據應用不同的函數對不同列數據應用不同函數使用內置統計方法聚合數據 實現數據拆分成組并分別計算平均數的操作 代碼: import pandas as pd import numpy as…

超硬核十萬字!全網最全 數據結構 代碼,隨便秒殺老師/面試官,我說的

本文代碼實現基本按照《數據結構》課本目錄順序,外加大量的復雜算法實現,一篇文章足夠。能換你一個收藏了吧? 當然如果落下什么了歡迎大家評論指出 目錄 順序存儲線性表實現 單鏈表不帶頭標準c語言實現 單鏈表不帶頭壓縮c語言實現 約瑟…

Python之分組級運算——【transform()方法、apply()方法】

文章目錄數據轉換——transform()方法數據應用——apply()方法數據轉換——transform()方法 使用aggregate()方法進行聚合運算已經在上一篇博客中詳細闡述,我們知道aggregate()方法返回的數據集的形狀(shape)與被分組的數據集的形狀是不同的…

java限制在同一臺電腦上只允許有一個用戶登錄系統

在web應用系統中,出于安全性考慮,經常需要對同一客戶端登錄的用戶數量和一個客戶同時在多個客戶端登陸進行限制。 具體一點就是: 1、在同一臺電腦上一次只允許有一個用戶登錄系統; 2、一個用戶在同一時間只允許在一個客戶端登錄…

Matplotlib——繪制圖表

文章目錄通過figure()函數創建畫布通過subplot()函數創建單個子圖通過subplots()函數創建多個子圖通過add_subplot()方法添加和選中子圖添加各類標簽繪制常見圖表繪制直方圖——hist()函數繪制散點圖——scatter()函數繪制柱狀圖——bar()函數設定線條的相關參數本地保存圖片通…

限制在同一臺電腦上只允許有一個用戶登錄系統

在web應用系統中,出于安全性考慮,經常需要對同一客戶端登錄的用戶數量和一個客戶同時在多個客戶端登陸進行限制。 具體一點就是: 1、在同一臺電腦上一次只允許有一個用戶登錄系統; 2、一個用戶在同一時間只允許在一個客戶端登錄…

Seaborn——繪制統計圖形

文章目錄可視化數據的分布繪制單變量分布繪制雙變量分布繪制成對的雙變量分布用分類數據繪圖類別散點圖通過stripplot()函數畫散點圖swarmplot()函數類別內的數據分布繪制箱型圖繪制提琴圖類別內的統計估計繪制條形圖繪制點圖可視化數據的分布 繪制單變量分布 一般采用最簡單…

Bokeh——交互式可視化庫

文章目錄前言如何通過Plotting繪制圖形前言 Bokeh是一個專門針對Web瀏覽器使用的交互式可視化庫,這是與其他可視化庫相比最核心的區別。 如何通過Plotting繪制圖形 Plotting是以構建視覺符號為核心的接口,可以結合各種視覺元素(例如&#x…

指針、引用以及const限定符、constexpr限定符

文章目錄復合類型引用概念與使用引用的定義注意指針概念聲明方式取地址符指針值空指針利用指針訪問對象賦值和指針void* 指針指向指針的指針指向指針的引用初始化所有指針有多重含義的某些符號const限定符概念const的引用指針和const頂層const和底層constconstexpr和常量表達式…

關鍵字typedef、關鍵字using、auto類型說明符和declytpe類型指示符

文章目錄類型別名概念關鍵字 typedef別名聲明 (alias declaration) using指針、常量和類型別名類型別名簡化多維數組指針auto類型說明符概念復合類型、常量和autodecltype類型指示符概念decltype和引用類型別名 概念 有兩種方法可用于定義類型別名。 關鍵字 typedef typede…

初始化、賦值、默認初始化、列表初始化、類內初始值、直接初始化與拷貝初始化

文章目錄初始化和賦值的區別什么是默認初始化?列表初始化列表初始化的使用場景不適合使用列表初始化的場景類內初始值混用string對象和C風格字符串數組與vector對象關于vector對象兩者間的初始化關系直接初始化與拷貝初始化初始化和賦值的區別 初始化的含義是創建變…

js動態增加,刪除td,tr,table,div

js實現的動態添加,刪除table內容: 截圖如下: 1. 2. 源代碼: main.css body {background-image: url(../images/qiantai/bg.png);font-family: arial;font-size: 12px;color: #d4d7da;text-align: center;background-repeat: r…