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.mzph.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