Pandas 合并數據集:concat 和 append

文章目錄

  • Pandas 合并數據集:concat 和 append
    • 回顧:NumPy 數組的拼接
    • 使用 pd.concat 進行簡單拼接
      • 重復索引
        • 將重復索引視為錯誤
        • 忽略索引
        • 添加多級索引(MultiIndex)鍵
      • 使用連接(Join)方式拼接
      • append 方法

Pandas 合并數據集:concat 和 append

封面

一些最有趣的數據研究來自于合并不同的數據源。
這些操作可以包括從非常簡單的兩個數據集的拼接,到更復雜的數據庫式連接和合并,這些操作能夠正確處理數據集之間的重疊部分。
SeriesDataFrame 都是為這種操作設計的,Pandas 提供了函數和方法,使得這種數據整理變得快速且簡單。

在這里,我們將首先介紹如何使用 pd.concat 函數對 SeriesDataFrame 進行簡單拼接;稍后我們會深入講解 Pandas 中更復雜的內存合并和連接操作。

我們從標準的導入開始:

import pandas as pd
import numpy as np

為了方便起見,我們將定義一個函數,用于創建特定格式的 DataFrame,這將在接下來的示例中非常有用。

# 快速創建DataFrame
def make_df(cols, ind):"""快速創建一個DataFrame"""data = {c: [str(c) + str(i) for i in ind]for c in cols}return pd.DataFrame(data, ind)# 創建一個示例DataFrame
df1 = make_df(['A', 'B', 'C'], [1, 2])
df2 = make_df(['A', 'B', 'C'], [3, 4])
df1
ABC
1A1B1C1
2A2B2C2
df2
ABC
3A3B3C3
4A4B4C4
make_df('ABC', range(3))
ABC
0A0B0C0
1A1B1C1
2A2B2C2

此外,我們還將創建一個快速類,用于讓我們能夠并排顯示多個 DataFrame。該代碼利用了特殊的 _repr_html_ 方法,這是 IPython/Jupyter 用于實現其豐富對象顯示的機制:

class display(object):"""Display HTML representation of multiple objects"""template = """<div style="float: left; padding: 10px;"><p style='font-family:"Courier New", Courier, monospace'>{0}</p>{1}</div>"""def __init__(self, *args):self.args = argsdef _repr_html_(self):return '\n'.join(self.template.format(a, eval(a)._repr_html_())for a in self.args)def __repr__(self):return '\n\n'.join(a + '\n' + repr(eval(a))for a in self.args)

隨著我們在接下來的章節中繼續討論,這個類的用途將會變得更加清晰。

回顧:NumPy 數組的拼接

SeriesDataFrame 對象的拼接行為類似于 NumPy 數組的拼接,可以通過 np.concatenate 函數實現,相關內容可參考 NumPy 數組基礎。
回顧一下,使用該函數可以將兩個或多個數組的內容合并為一個數組:

x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
np.concatenate([x, y, z])
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

第一個參數是要連接的數組的列表或元組。
此外,對于多維數組,還可以使用 axis 關鍵字參數,指定沿哪個軸進行拼接:

x = [[1, 2],[3, 4]]
np.concatenate([x, x], axis=1)
array([[1, 2, 1, 2],[3, 4, 3, 4]])

使用 pd.concat 進行簡單拼接

pd.concat 函數提供了類似于 np.concatenate 的語法,但包含了許多我們稍后會討論的選項:

# Pandas v1.3.5 中的函數簽名
pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None,levels=None, names=None, verify_integrity=False,sort=False, copy=True)

pd.concat 可以用于簡單地拼接 SeriesDataFrame 對象,就像 np.concatenate 可以用于簡單地拼接數組一樣:

ser1 = pd.Series(['A', 'B', 'C'], index=[1, 2, 3])
ser2 = pd.Series(['D', 'E', 'F'], index=[4, 5, 6])
pd.concat([ser1, ser2])
1    A
2    B
3    C
4    D
5    E
6    F
dtype: object

它同樣適用于拼接更高維度的對象,比如 DataFrame

df1 = make_df('AB', [1, 2])
df2 = make_df('AB', [3, 4])
display('df1', 'df2', 'pd.concat([df1, df2])')

df1

AB
1A1B1
2A2B2

df2

AB
3A3B3
4A4B4

pd.concat([df1, df2])

AB
1A1B1
2A2B2
3A3B3
4A4B4

它的默認行為是在 DataFrame 內按行拼接(即 axis=0)。
np.concatenate 類似,pd.concat 允許指定拼接所沿的軸。
請看下面的例子:

df3 = make_df('AB', [0, 1])
df4 = make_df('CD', [0, 1])
display('df3', 'df4', "pd.concat([df3, df4], axis='columns')")

df3

AB
0A0B0
1A1B1

df4

CD
0C0D0
1C1D1

pd.concat([df3, df4], axis='columns')

ABCD
0A0B0C0D0
1A1B1C1D1

我們同樣可以指定 axis=1;這里我們使用了更直觀的 axis='columns'

重復索引

np.concatenatepd.concat 之間的一個重要區別是,Pandas 的拼接操作會保留索引,即使結果中會出現重復的索引!
請看下面這個簡短的例子:

x = make_df('AB', [0, 1])
y = make_df('AB', [2, 3])
y.index = x.index  # make indices match
display('x', 'y', 'pd.concat([x, y])')

x

AB
0A0B0
1A1B1

y

AB
0A2B2
1A3B3

pd.concat([x, y])

AB
0A0B0
1A1B1
0A2B2
1A3B3

注意結果中重復的索引。
雖然在 DataFrame 中這是允許的,但這種結果通常并不是我們想要的。
pd.concat 為我們提供了幾種處理這種情況的方法。

將重復索引視為錯誤

如果你希望在 pd.concat 的結果中索引沒有重疊,可以設置 verify_integrity 參數為 True
這樣拼接時如果出現重復索引,就會拋出異常。
下面是一個示例,為了更清晰,我們會捕獲并打印錯誤信息:

try:pd.concat([x, y], verify_integrity=True)
except ValueError as e:print("ValueError:", e)
ValueError: Indexes have overlapping values: Index([0, 1], dtype='int64')
忽略索引

有時候索引本身并不重要,你可能更希望直接忽略它。
可以通過設置 ignore_index 參數來實現這一點。
當該參數設為 True 時,拼接后的結果會為新的 DataFrame 創建一個新的整數索引:

display('x', 'y', 'pd.concat([x, y], ignore_index=True)')

x

AB
0A0B0
1A1B1

y

AB
0A2B2
1A3B3

pd.concat([x, y], ignore_index=True)

AB
0A0B0
1A1B1
2A2B2
3A3B3
添加多級索引(MultiIndex)鍵

另一種選擇是使用 keys 選項為數據源指定標簽;結果將是一個包含這些數據的分層索引(MultiIndex)序列:

display('x', 'y', "pd.concat([x, y], keys=['x', 'y'])")

x

AB
0A0B0
1A1B1

y

AB
0A2B2
1A3B3

pd.concat([x, y], keys=['x', 'y'])

AB
x0A0B0
1A1B1
y0A2B2
1A3B3

我們可以使用分層索引中討論的工具,將這個多重索引的 DataFrame 轉換為我們感興趣的表示形式。

使用連接(Join)方式拼接

在前面的簡短示例中,我們主要拼接的是具有相同列名的 DataFrame
實際上,來自不同數據源的數據可能具有不同的列集合,此時 pd.concat 提供了多種選項。
請看下面兩個 DataFrame 的拼接示例,它們只有部分(而不是全部)列名相同:

df5 = make_df('ABC', [1, 2])
df6 = make_df('BCD', [3, 4])
display('df5', 'df6', 'pd.concat([df5, df6])')

df5

ABC
1A1B1C1
2A2B2C2

df6

BCD
3B3C3D3
4B4C4D4

pd.concat([df5, df6])

ABCD
1A1B1C1NaN
2A2B2C2NaN
3NaNB3C3D3
4NaNB4C4D4

默認行為是用 NA 值填充沒有數據的位置。
要更改這一點,我們可以調整 concat 函數的 join 參數。
默認情況下,join 是輸入列的并集(join='outer'),但我們也可以通過設置 join='inner',將其改為只保留列的交集:

display('df5', 'df6',"pd.concat([df5, df6], join='inner')")

df5

ABC
1A1B1C1
2A2B2C2

df6

BCD
3B3C3D3
4B4C4D4

pd.concat([df5, df6], join='inner')

BC
1B1C1
2B2C2
3B3C3
4B4C4

另一種有用的模式是在拼接前使用 reindex 方法,以更精細地控制哪些列被舍棄:

pd.concat([df5, df6.reindex(df5.columns, axis=1)])
ABC
1A1B1C1
2A2B2C2
3NaNB3C3
4NaNB4C4

append 方法

由于直接拼接數組非常常見,在Pandas 2.0.0版本之前,SeriesDataFrame 對象都提供了 append 方法,可以用更少的代碼實現同樣的功能。
但值得注意的是,自 Pandas 2.0.0 開始,不再支持append方法,故以下的示例將報 AttributeError。

display('df1', 'df2', 'df1.append(df2)')

請注意,與 Python 列表的 appendextend 方法不同,Pandas 中的 append 方法不會修改原始對象;它會創建一個包含合并數據的新對象。
此外,這種方法的效率并不高,因為它涉及新索引和數據緩沖區的創建。
因此,如果你打算進行多次 append 操作,通常更好的做法是先構建一個 DataFrame 對象的列表,然后一次性傳遞給 concat 函數。

Pandas有更強大的多數據源合并方法:pd.merge 實現的數據庫式合并/連接。
關于 concatappend 及相關功能的更多信息,請參閱 Pandas 文檔的“合并、連接、拼接與比較”部分。

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

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

相關文章

2025年5月架構設計師綜合知識真題回顧,附參考答案、解析及所涉知識點(七)

本文主要回顧2025年上半年(2025-5-24)系統架構設計師考試上午綜合知識科目的選擇題,同時附帶參考答案、解析和所涉知識點。 2025年5月架構設計師綜合知識真題回顧,附參考答案、解析及所涉知識點(一) 2025年5月架構設計師綜合知識真題回顧,附參考答案、解析及所涉知識點(…

面向RF設計人員的微帶貼片天線計算器

微帶貼片天線和陣列可能是僅次于單極天線和偶極天線的最簡單的天線設計。這些天線也很容易集成到PCB中&#xff0c;因此通常用于5G天線陣列和雷達等高級系統。這些天線陣列在基諧模式和高階模式下也遵循一組簡單的設計方程&#xff0c;因此您甚至可以在不使用仿真工具的情況下設…

明基RD280U編程顯示器深度測評:碼農的「第二塊鍵盤」竟然會發光?

文章目錄前言一、開箱篇&#xff1a;當理工男遇到「俄羅斯套娃式包裝」二、外觀篇&#xff1a;深空灰的「代碼容器」1. 桌面變形記2. 保護肩頸的人體工學設計三、顯示篇&#xff1a;給代碼做「光子嫩膚」1. 28寸超大大屏 3:2屏比 4K超清2.專業編程模式&#xff0c;讓代碼一目…

算法114. 二叉樹展開為鏈表

題目&#xff1a;給你二叉樹的根結點 root &#xff0c;請你將它展開為一個單鏈表&#xff1a; 展開后的單鏈表應該同樣使用 TreeNode &#xff0c;其中 right 子指針指向鏈表中下一個結點&#xff0c;而左子指針始終為 null 。 展開后的單鏈表應該與二叉樹 先序遍歷 順序相同。…

智慧能源管理系統:點亮山東零碳園區的綠色引擎

一、概述在全球積極踐行“雙碳”目標的時代浪潮下&#xff0c;山東作為經濟大省&#xff0c;正全力推動產業的綠色變革&#xff0c;零碳園區建設成為其中的關鍵一環。《山東省零碳園區建設方案》明確規劃&#xff0c;到2027年建成15個左右省級零碳園區 &#xff0c;到2030年進一…

分布式日志分析平臺(ELFK 與 EFK)理論

一、日志分析平臺核心概念在分布式系統中&#xff0c;日志是系統運行狀態監控、問題排查和業務分析的重要依據。隨著系統規模擴大&#xff0c;單機日志管理方式已無法滿足需求&#xff0c;分布式日志分析平臺應運而生。其核心目標是實現日志的集中收集、統一處理、高效存儲和可…

CoreShop微信小程序商城框架開啟多租戶-添加一個WPF客戶端以便進行本地操作--讀取店鋪信息(6)

本節內容&#xff0c;使用登錄的token進行店鋪信息讀取&#xff0c;順利的話&#xff0c;進行EXCEL上傳測試。 1。在后臺編寫 讀取店鋪信息代碼 1.1 查看原來鋪店信息在什么位置&#xff0c;店鋪的表格為CoreCmsStore#region 獲取列表// POST: Api/CoreCmsStore/GetPageList///…

UE5關卡藍圖能不能保存副本呀?

提問 關卡藍圖能不能保存副本呀&#xff1f; 回答 在 UE 里&#xff0c;“關卡藍圖&#xff08;Level Blueprint&#xff09;”本身其實是不能直接復制/保存成獨立資源的&#xff0c;因為它和具體的 **Level&#xff08;.umap 文件&#xff09;**是綁定的——相當于一個“場景腳…

機器學習數據預處理學習報告

一、學習背景與目的在機器學習流程中&#xff0c;數據預處理是保障模型訓練效果的關鍵環節。原始數據常存在缺失值、量綱不一致、特征格式不匹配等問題&#xff0c;直接影響模型對數據規律的學習。本次學習圍繞 Pandas 與 Scikit-learn&#xff08;sklearn&#xff09;工具庫&a…

git舊倉庫遷移到新倉庫

git舊倉庫遷移到新倉庫 A倉庫(舊倉庫)&#xff1a;git172.16.21.21:xxxx_software/Ni-Handler-Mgr.git B倉庫(新倉庫)&#xff1a;git172.16.11.11:yyyy/hostpc/ni-handler-mgr.git Step1 新建新倉庫 創建新 GitHub 倉庫? 在 GitHub 頁面點擊 “New repository”&#xff0c;命…

YOLO --- YOLOv5模型以及項目詳解

YOLO — YOLOv5模型以及項目詳解 文章目錄YOLO --- YOLOv5模型以及項目詳解一&#xff0c;開源地址二&#xff0c;改進點Focus 模塊三&#xff0c;網絡結構3.1 CSP1_X 與 CSP2_X3.2 自適應Anchor的計算3.3 激活函數3.3.1 SiLU3.3.2 Swish3.4 Bottleneck3.5 C33.5.1 BottleneckC…

Linux文本三劍客的使用及常見重點操作

文本三劍客指 Linux環境下的 grep&#xff08;搜索&#xff09;、sed&#xff08;編輯&#xff09;、awk&#xff08;分析&#xff09;三款用于文本處理的核心命令&#xff0c;三者分工明確、功能互補&#xff0c;是處理日志、配置文件、結構化數據等場景的 “剛需工具”。一、…

??《開源字幕神器VideoCaptioner實戰:基于Whisper+LLM的全鏈路方案,免費平替剪映會員》??

&#x1f4cc; 大家好&#xff0c;我是智界工具庫&#xff0c;每天分享好用實用且智能的開源項目&#xff0c;以及在JAVA語言開發中遇到的問題&#xff0c;如果本篇文章對您有所幫助&#xff0c;請幫我點個小贊小收藏小關注吧&#xff0c;謝謝喲&#xff01;&#x1f618; 博主…

redisIO模型

??1. 總述核心??“Redis采用了??單線程的Reactor模型??來處理網絡IO和命令請求。其核心在于&#xff0c;??它使用一個主線程通過IO多路復用機制來并發地處理大量的客戶端連接&#xff0c;而實際的命令解析和執行則是單線程的??。”這句話非常重要&#xff0c;它直接…

視覺采集模塊的用法

一、圖像源模塊用法采集模塊中最基礎的單元就是圖像源模塊&#xff0c;其中圖像的輸入方式包括相機輸入、本地圖像、SDK三種。添加圖像源后&#xff0c;需要對內部的參數進行對應的配置&#xff0c;正常我們連接相機后圖像源選擇我們對應的連接相機。配置所需要的相機參數&…

Linux下基于Electron的程序ibus輸入法問題

Linux下基于Electron的程序ibus輸入法問題 最近想體驗一下KDE Plasma桌面&#xff0c;遇到一個問題&#xff0c;就是瀏覽器輸入不了中文&#xff0c;Edge、Chrome都一樣&#xff0c;當然它們都是基于Chromium的&#xff0c;出同樣的問題很正常。后面發現Visual Code也有同樣的問…

Ubuntu20系統上離線安裝MongoDB

Ubuntu20系統上離線安裝MongoDB 準備工作&#xff1a;下載安裝包及依賴? 下載MongoDB二進制包? 在聯網環境中訪問MongoDB官網&#xff0c;選擇以下配置&#xff1a; 下載地址&#xff1a;https://www.mongodb.com/try/download/community ?Version?&#xff1a;需與目標系統…

K-Means 聚類算法如何選擇初始點

n_clusters 參數是告訴 K-Means 算法對 整個數據集 (X_scaled) 進行分簇。讓我們分解一下這個過程的邏輯&#xff1a;目標&#xff1a;我們的目標不是要對數據進行分類&#xff0c;而是要從成百上千個數據點中&#xff0c;智能地挑選出大約30個點作為貝葉斯優化的“起點”。這些…

聚銘安全管家平臺2.0實戰解碼 | 安服篇(四):重構威脅追溯體系

在企業安全運營中&#xff0c;兩類問題常常讓團隊陷入被動 1、“看得見威脅&#xff0c;卻追不到源頭” 明明檢測到多臺內網設備遭攻擊&#xff0c;卻遲遲找不到攻擊源頭&#xff0c;更說不清攻擊者用了什么手法&#xff0c;導致無法及時封禁或隔離。 2、“找到了源頭&#xff…

【Microi吾碼】:低代碼加速業務和技術深度融合

目錄 一.低代碼優勢&#xff1a; 1.1低代碼平臺和傳統代碼開發&#xff1a; 1.2低代碼和0代碼平臺&#xff1a; 1.3低代碼平臺&#xff1a;Microi吾碼 二.關于開源低代碼平臺&#xff1a;Microi吾碼 2.1Mircroi吾碼介紹&#xff1a; 2.2產品特點&#xff1a; 2.3產品團…