python數據分析(六):Pandas 多數據操作全面指南

Pandas 多數據操作全面指南:Merge, Join, Concatenate 與 Compare

1. 引言

在數據分析工作中,我們經常需要處理多個數據集并將它們以各種方式組合起來。Pandas 提供了多種強大的多數據操作方法,包括合并(merge)、連接(join)、連接(concatenate)和比較(compare)等。本文將詳細介紹這些功能,并通過實際代碼示例展示如何使用它們。

2. 數據合并 (Merge)

2.1 基本合并操作

merge() 是 Pandas 中最常用的數據合并方法,類似于 SQL 中的 JOIN 操作。

import pandas as pd# 創建兩個示例DataFrame
df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],'value': [1, 2, 3, 4]})df2 = pd.DataFrame({'key': ['B', 'D', 'E', 'F'],'value': [5, 6, 7, 8]})# 內連接(inner join)
result = pd.merge(df1, df2, on='key')
print("Inner Join:\n", result)

輸出

Inner Join:key  value_x  value_y
0   B        2        5
1   D        4        6

解釋

  • on='key' 指定了合并的鍵
  • 默認是內連接(inner join),只保留兩個DataFrame中都有的鍵
  • 自動為相同列名添加后綴 _x_y

2.2 不同類型的連接

# 左連接(left join)
result = pd.merge(df1, df2, on='key', how='left')
print("\nLeft Join:\n", result)# 右連接(right join)
result = pd.merge(df1, df2, on='key', how='right')
print("\nRight Join:\n", result)# 外連接(full outer join)
result = pd.merge(df1, df2, on='key', how='outer')
print("\nOuter Join:\n", result)

輸出

Left Join:key  value_x  value_y
0   A        1      NaN
1   B        2      5.0
2   C        3      NaN
3   D        4      6.0Right Join:key  value_x  value_y
0   B      2.0        5
1   D      4.0        6
2   E      NaN        7
3   F      NaN        8Outer Join:key  value_x  value_y
0   A      1.0      NaN
1   B      2.0      5.0
2   C      3.0      NaN
3   D      4.0      6.0
4   E      NaN      7.0
5   F      NaN      8.0

解釋

  • how 參數控制連接類型:‘left’, ‘right’, ‘outer’, ‘inner’
  • 缺失值用 NaN 填充

2.3 多鍵合并

# 創建含有多個鍵的DataFrame
df3 = pd.DataFrame({'key1': ['A', 'B', 'C', 'D'],'key2': ['W', 'X', 'Y', 'Z'],'value': [1, 2, 3, 4]})df4 = pd.DataFrame({'key1': ['B', 'D', 'E', 'F'],'key2': ['X', 'Z', 'Y', 'W'],'value': [5, 6, 7, 8]})# 多鍵合并
result = pd.merge(df3, df4, on=['key1', 'key2'])
print("\nMulti-key Merge:\n", result)

輸出

Multi-key Merge:key1 key2  value_x  value_y
0    B    X        2        5
1    D    Z        4        6

3. 數據連接 (Join)

3.1 DataFrame的join方法

join()merge() 的便捷方法,默認按索引連接。

# 設置索引
df1.set_index('key', inplace=True)
df2.set_index('key', inplace=True)# 使用join連接
result = df1.join(df2, lsuffix='_left', rsuffix='_right')
print("\nJoin on Index:\n", result)

輸出

Join on Index:value_left  value_right
key                          
A           1.0          NaN
B           2.0          5.0
C           3.0          NaN
D           4.0          6.0

解釋

  • 默認是左連接
  • 必須指定 lsuffixrsuffix 來處理列名沖突
  • 按索引連接而不是列

3.2 按列連接

# 重置索引
df1.reset_index(inplace=True)
df2.reset_index(inplace=True)# 按列連接
result = df1.set_index('key').join(df2.set_index('key'), how='outer', lsuffix='_left', rsuffix='_right')
print("\nJoin on Column:\n", result)

4. 數據連接 (Concatenate)

4.1 基本連接操作

concat() 用于沿特定軸連接多個DataFrame或Series。

# 創建示例DataFrame
df5 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2']},index=[0, 1, 2])df6 = pd.DataFrame({'A': ['A3', 'A4', 'A5'],'B': ['B3', 'B4', 'B5']},index=[3, 4, 5])# 垂直連接(沿axis=0)
result = pd.concat([df5, df6])
print("\nVertical Concatenation:\n", result)# 水平連接(沿axis=1)
result = pd.concat([df5, df6], axis=1)
print("\nHorizontal Concatenation:\n", result)

輸出

Vertical Concatenation:A   B
0  A0  B0
1  A1  B1
2  A2  B2
3  A3  B3
4  A4  B4
5  A5  B5Horizontal Concatenation:A   B    A    B
0  A0  B0  NaN  NaN
1  A1  B1  NaN  NaN
2  A2  B2  NaN  NaN
3  NaN  NaN  A3  B3
4  NaN  NaN  A4  B4
5  NaN  NaN  A5  B5

4.2 連接時處理索引

# 忽略原有索引
result = pd.concat([df5, df6], ignore_index=True)
print("\nConcatenation with Ignored Index:\n", result)# 添加多級索引
result = pd.concat([df5, df6], keys=['df5', 'df6'])
print("\nConcatenation with MultiIndex:\n", result)

5. 數據比較 (Compare)

5.1 比較兩個DataFrame

Pandas 提供了多種比較DataFrame的方法。

# 創建兩個相似但有差異的DataFrame
df7 = pd.DataFrame({'A': [1, 2, 3],'B': [4, 5, 6]})df8 = pd.DataFrame({'A': [1, 2, 4],'B': [4, 6, 6]})# 使用compare方法(需要Pandas 1.1.0+)
try:comparison = df7.compare(df8)print("\nDataFrame Comparison:\n", comparison)
except AttributeError:print("\ncompare() method requires pandas 1.1.0 or later")# 替代方法diff = df7 != df8print("\nDifference:\n", diff)

輸出(如果使用compare方法):

DataFrame Comparison:A       B      self other self other
2  3.0   4.0  NaN   NaN
1  NaN   NaN  5.0   6.0

5.2 比較并標記差異

# 標記所有差異
def highlight_diff(data, color='yellow'):attr = f'background-color: {color}'other = data.xs('other', axis='columns', level=-1)self = data.xs('self', axis='columns', level=-1)return pd.DataFrame(np.where(self != other, attr, ''),index=data.index, columns=data.columns)comparison.style.apply(highlight_diff, axis=None)

6. 其他實用合并技巧

6.1 合并時處理重復列名

# 合并時有重復列名
df9 = pd.DataFrame({'key': ['A', 'B', 'C'],'value': [1, 2, 3]})df10 = pd.DataFrame({'key': ['B', 'C', 'D'],'value': [4, 5, 6]})result = pd.merge(df9, df10, on='key', suffixes=('_left', '_right'))
print("\nMerge with Suffixes:\n", result)

6.2 合并時驗證關系

# 驗證合并關系(確保是一對一、一對多或多對一)
try:result = pd.merge(df9, df10, on='key', validate='one_to_one')print("\nValidated Merge:\n", result)
except Exception as e:print("\nValidation Error:", e)

7. 性能考慮

7.1 合并大型DataFrame

# 創建大型DataFrame
import numpy as np
n = 1000000
big_df1 = pd.DataFrame({'key': np.random.randint(0, 10000, size=n),'value1': np.random.randn(n)})big_df2 = pd.DataFrame({'key': np.random.randint(0, 10000, size=n),'value2': np.random.randn(n)})# 比較合并方法的性能
%timeit pd.merge(big_df1, big_df2, on='key')
%timeit big_df1.merge(big_df2, on='key')

8. 總結

  1. merge() 是最靈活的數據合并方法,支持各種SQL風格的連接操作

    • 支持內連接、左連接、右連接和外連接
    • 可以處理多鍵合并和復雜的合并條件
  2. join() 是基于索引的合并便捷方法

    • 默認按索引連接
    • 語法比merge()更簡潔但功能較少
  3. concat() 用于簡單堆疊數據

    • 可以沿行(垂直)或列(水平)方向連接
    • 適合結構相同的數據集合并
  4. compare() 用于比較兩個DataFrame的差異

    • 可以高亮顯示差異
    • 需要Pandas 1.1.0及以上版本
  5. 性能考慮

    • 對于大型數據集,merge()通常比join()更快
    • 合并前適當設置索引可以提高性能

選擇合適的多數據操作方法取決于:

  • 數據的大小和結構
  • 需要執行的連接類型
  • 是否需要保留所有數據或只保留匹配項

掌握這些多數據操作技術將大大提高你在實際數據分析工作中的效率和靈活性。

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

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

相關文章

spring 面試題

一、Spring 基礎概念 什么是 Spring 框架? Spring 是一個開源的 Java 應用程序框架,它提供了一種輕量級的、非侵入式的方式來構建企業級應用。Spring 的核心功能包括依賴注入(Dependency Injection,DI)、面向切面編程…

OpenCV-Python (官方)中文教程(部分一)_Day20

22.直方圖 22.1直方圖的計算,繪制與分析 使用 OpenCV 或 Numpy 函數計算直方圖 使用 Opencv 或者 Matplotlib 函數繪制直方圖 將要學習的函數有:cv2.calcHist(),np.histogram() 什么是直方圖呢?通過直方圖你可以對整幅圖像的灰度分布有一個整體的 了…

數電發票整理:免費實用工具如何高效解析 XML 發票數據

如今數字電子發票越來越普及,但是數電發票的整理還是頗有講究~ 今天給大家介紹一個 XML 發票閱讀器。使用它完全不收取任何費用,且無廣告干擾,對財務人員而言十分實用。 01 軟件介紹 這款軟件就是XML格式(數電票)閱讀…

深度學習正則化:原理、方法與應用深度解析

摘要 本文深入探討深度學習中的正則化技術,介紹其避免過擬合的重要性,詳細講解常見的正則化方法,如 L 1 L_1 L1?和 L 2 L_2 L2?正則化、Dropout等,并通過線性回歸案例和神經網絡訓練流程對其進行直觀闡釋。幫助讀者理解正則化原…

【爬蟲】deepseek談爬蟲工具

2025 年,隨著 Web 技術的演進和反爬機制的升級,工具生態也會進一步優化。以下是 2025 年爬蟲 & 自動化測試的前沿工具預測,結合行業趨勢和現有技術發展方向: 🚀 2025 年推薦組合(預測版) 1…

SQLMesh 測試自動化:提升數據工程效率

在現代數據工程中,確保數據模型的準確性和可靠性至關重要。SQLMesh 提供了一套強大的測試工具,用于驗證數據模型的輸出是否符合預期。本文將深入探討 SQLMesh 的測試功能,包括如何創建測試、支持的數據格式以及如何運行和調試測試。 SQLMesh …

Java學習手冊:Spring 中常用的注解

一、組件注解 Component :用于標記一個類為 Spring 管理的 Bean,是 Spring 的基本組件注解。Spring 會通過類路徑掃描自動檢測并注冊標記了 Component 的類為 Bean。Service :是 Component 的派生注解,用于標記服務層類&#xff…

前端跨域問題詳解:原因、解決方案與最佳實踐

引言 在現代Web開發中,跨域問題是前端工程師幾乎每天都會遇到的挑戰。隨著前后端分離架構的普及和微服務的發展,跨域請求變得愈發常見。本文將深入探討跨域問題的本質、各種解決方案以及在實際開發中的最佳實踐。 一、什么是跨域問題? 1.1…

[計算機網絡]物理層

文章目錄 物理層的概述與功能傳輸介質雙絞線:分類:應用領域: 同軸電纜:分類: 光纖:分類: 無線傳輸介質:無線電波微波:紅外線:激光: 物理層設備中繼器:放大器:集線器(Hub)&#xff1a…

大連理工大學選修課——機器學習筆記(9):線性判別式與邏輯回歸

線性判別式與邏輯回歸 概述 判別式方法 產生式模型需要計算輸入、輸出的聯合概率 需要知道樣本的概率分布,定義似然密度的隱式參數也稱為基于似然的分類 判別式模型直接構造判別式 g i ( x ∣ θ i ) g_i(x|\theta_i) gi?(x∣θi?),顯式定義判別式…

OpenCV 圖像處理核心技術 (第二部分)

歡迎來到 OpenCV 圖像處理的第二部分!在第一部分,我們學習了如何加載、顯示、保存圖像以及訪問像素等基礎知識。現在,我們將深入探索如何利用 OpenCV 提供的強大工具來修改和分析圖像。 圖像處理是計算機視覺領域的基石。通過對圖像進行各種…

【鴻蒙HarmonyOS】一文詳解華為的服務卡片

7.服務卡片 1.什么是卡片 Form Kit(卡片開發服務)提供一種界面展示形式,可以將應用的重要信息或操作前置到服務卡片(以下簡稱“卡片”),以達到服務直達、減少跳轉層級的體驗效果。卡片常用于嵌入到其他應…

探索目標檢測:邊界框與錨框的奧秘

筆者在2022年開始學習目標檢測的時候,對各種框的概念那是相當混淆,比如: 中文名詞:邊界框、錨框、真實框、預測框等英文名詞:BoundingBox、AnchorBox、Ground Truth等 同一個英文名詞比如BoundingBox翻譯成中文也有多個…

[原創](現代Delphi 12指南):[macOS 64bit App開發]: [1]如何使用原生NSAlert消息框 (runModal模式)

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 開發工具: Visual Studio、Delphi、XCode、…

LangChain的向量RAG與MCP在意圖識別的主要區別

LangChain的向量RAG與MCP在意圖識別實現上的區別主要體現在技術路徑、流程設計以及應用場景三個方面: 1. 技術路徑差異 LangChain向量RAG 語義相似度驅動:通過用戶輸入的原始查詢與向量化知識庫的語義匹配實現意圖識別。例如,用戶提問"…

[特殊字符] Spring Cloud 微服務配置統一管理:基于 Nacos 的最佳實踐詳解

在微服務架構中,配置文件眾多、管理復雜是常見問題。本文將手把手演示如何將配置集中托管到 Nacos,并在 Spring Cloud Alibaba 項目中實現統一配置管理 自動刷新機制。 一、為什么要使用 Nacos 統一配置? 傳統方式下,每個服務都…

2025平航杯—團隊賽

2025平航杯團隊賽 計算機取證 分析起早王的計算機檢材,起早王的計算機插入過USB序列號是什么(格式:1)分析起早王的計算機檢材,起早王的便簽里有幾條待干(格式:1)分析起早王的計算機檢材,起早王的計算機默認瀏覽器是什…

JSON-RPC 2.0 規范中文版——無狀態輕量級遠程過程調用協議

前言 JSON-RPC是一種簡單、輕量且無狀態的遠程過程調用(RPC)協議,它允許不同系統通過標準化的數據格式進行通信。自2010年由JSON-RPC工作組發布以來,已成為眾多應用中實現遠程交互的基礎協議之一。本規范主要表達了JSON-RPC 2.0版…

微控制器編程 | ISP、IAP 與 ICP 的原理與比較

注:英文引文,機翻未校。 圖片清晰度限于引文原狀。 Introduction to Programming of Microcontroller: ISP, IAP and ICP 微控制器編程介紹:ISP、IAP 和 ICP Date: 30-11-2022 1. What is Microcontroller Programming 什么是微控制器編…

Allegro23.1新功能之新型via structure創建方法操作指導

Allegro23.1新功能之新型via structure創建方法操作指導 Allegro升級到了23.1后,支持創建新型via structure 通過直接定義參數來生成 具體操作如下 打開軟件,選擇 Allegro PCB Designer