【Python从入门到进阶】63.Pandas如何实现数据的Merge

news2024/9/20 5:37:01

接上篇《62、Pandas中DataFrame对象案例实践》
上一篇我们延续之前学习的DataFrame对象的知识,结合一个数据案例进行了实践操作。本篇我们来学习Pandas如何实现数据的Merge。

一、引言

在当今数据驱动的时代,数据分析已成为各行各业不可或缺的一部分。无论是商业决策、科学研究还是技术创新,都离不开对数据的深入洞察。然而,在实际的数据分析过程中,我们往往不会直接面对单一、干净、结构良好的数据源。相反,数据往往分散存储在多个不同格式、不同来源的数据库中,或者是分散在多个相互关联的表格、文件中。因此,数据整合作为数据分析的第一步,其重要性不言而喻。

1、数据分析中数据整合的重要性

数据整合是指将来自不同来源、不同格式的数据,通过一定的方法和手段,转化为一个统一、规范、结构化的数据集,以便后续的数据分析和挖掘工作。这一过程不仅有助于提高数据分析的效率和准确性,还能避免因为数据不一致性、冗余性等问题导致的分析结果偏差。具体来说,数据整合的重要性体现在以下几个方面:

●提升数据质量:通过清洗、去重、标准化等整合操作,可以提高数据的准确性、完整性和一致性,为后续的数据分析打下坚实的基础。
●优化数据存储:将分散的数据整合到一个统一的平台或数据库中,可以方便数据的集中管理和维护,同时减少数据冗余,提高存储空间利用率。
●促进数据共享:整合后的数据更加易于被不同部门、不同团队甚至不同组织之间共享和利用,从而加速信息流通,促进协同工作。
●支持深入分析:一个完整、规范的数据集能够支持更复杂、更深入的数据分析,帮助我们发现数据背后的规律和趋势,为决策提供有力支持。

2、Pandas库在Python数据分析中的核心地位

在Python的数据分析生态系统中,Pandas库凭借其高效、灵活、易用的特点,迅速成为了数据分析师的首选工具之一。Pandas提供了大量的数据处理和分析功能,包括但不限于数据清洗、数据转换、数据合并、数据排序、数据分组聚合等。这些功能极大地简化了数据分析的流程,提高了数据分析的效率。

尤为重要的是,Pandas对于表格数据的处理能力尤为突出。它提供了一个类似于Excel的数据结构——DataFrame,使得用户可以像操作Excel表格一样轻松地进行数据的读取、写入、筛选、排序等操作。此外,Pandas还提供了丰富的数据合并(Merge)功能,使得用户能够轻松地将来自不同数据源的数据整合在一起,满足各种复杂的数据分析需求。

3、数据合并(Merge)在数据处理中的重要性

在数据处理的众多环节中,数据合并无疑是一个至关重要且频繁出现的需求。在实际的数据分析项目中,我们经常会遇到需要将多个相关的数据集合并在一起进行分析的情况。比如,在电商数据分析中,我们可能需要将用户信息表、订单信息表、商品信息表等多个表格合并起来,以便综合分析用户的购买行为、商品的销售情况等。又如,在医学研究中,我们可能需要将不同时间点的患者数据表合并起来,以追踪患者病情的变化趋势。

Pandas提供了多种数据合并的方法,包括内连接(Inner Join)、左连接(Left Join)、右连接(Right Join)、外连接(Outer Join)等,用户可以根据实际需求选择合适的合并方式。这些强大的合并功能不仅使得数据整合工作变得简单易行,还大大提升了数据分析的灵活性和深度。因此,掌握Pandas的数据合并功能对于数据分析师来说至关重要。

二、Pandas Merge基础

在数据分析领域,Pandas库以其强大的数据处理能力著称,而其中的Merge操作更是数据处理中不可或缺的一环。Merge操作允许我们根据一个或多个键将两个或多个DataFrame或Series对象按行合并,从而实现数据的整合与分析。

1、Merge概述

定义:
Pandas中的Merge操作是指基于一定的条件(即连接键),将两个或多个DataFrame或Series对象按行进行合并。这些连接键可以是DataFrame中的列名,也可以是DataFrame的索引。Merge操作的核心在于找出各个DataFrame之间共通的连接键,并将这些共通键对应的行合并在一起,形成一个新的DataFrame。

应用场景:
Merge操作在数据分析中具有广泛的应用场景。比如,在电商数据分析中,我们可能需要将用户信息表(包含用户的基本信息,如姓名、地址等)和订单表(包含用户的购买记录,如订单号、购买商品等)合并起来,以便获取完整的用户购买记录。这样,我们就可以轻松地分析用户的购买行为、偏好等信息,为商家提供有针对性的营销策略。

2、Merge的基本参数

Pandas的Merge操作提供了多个参数来控制合并的行为,以满足不同的数据分析需求。以下是Merge操作中最常用的几个参数:

(1)on:
这个参数用于指定用于连接的列名。如果两个DataFrame中有相同名称的列,且该列是我们希望基于其进行合并的键,那么我们可以直接将该列名传递给on参数。这样,Pandas就会根据这个列名来找到两个DataFrame中共通的行,并将它们合并在一起。
(2)how:
这个参数用于指定合并的方式,共有四种选择:'left', 'right', 'outer', 'inner'。

●'left':左连接,返回左DataFrame的所有行。如果右DataFrame中没有匹配的行,则结果中这部分的值为NaN。
●'right':右连接,与左连接相反,返回右DataFrame的所有行。
●'outer':外连接,返回两个DataFrame中所有的行。如果某个DataFrame中没有匹配的行,则结果中这部分的值为NaN。
●'inner':内连接,仅返回两个DataFrame中都有的行。

(3)left_on/right_on
这两个参数分别用于指定左DataFrame和右DataFrame中用于连接的列名。当左右DataFrame中用于连接的列名不一致时,我们需要使用这两个参数来明确指定它们。比如,左DataFrame的连接键是user_id,而右DataFrame的连接键是customer_id,此时我们就可以通过left_on='user_id', right_on='customer_id'来指定合并的条件。
(4)left_index/right_index
这两个参数是布尔值,用于指定是否使用索引作为连接键。如果我们将left_index设置为True,那么左DataFrame的索引将被用作连接键;同样地,如果我们将right_index设置为True,那么右DataFrame的索引将被用作连接键。这种情况下,我们不需要指定on、left_on或right_on参数。
(5)suffixes
当两个DataFrame在合并时存在列名冲突(即两个DataFrame中有相同的列名,但这些列并不代表相同的数据)时,suffixes参数就显得尤为重要了。它是一个元组,用于为重叠的列名添加后缀,以区分它们来自哪个DataFrame。比如,我们可以将suffixes设置为('_left', '_right'),这样合并后的DataFrame中,左DataFrame的列名会加上_left后缀,右DataFrame的列名会加上_right后缀。

三、Merge的具体操作

1、示例数据准备

在进行Merge操作之前,我们首先需要准备两个简单的DataFrame作为示例。这些DataFrame将用于展示如何合并它们。

import pandas as pd  
  
# 创建第一个DataFrame:员工信息表  
df1 = pd.DataFrame({  
    '员工ID': [1, 2, 3, 4],  
    '姓名': ['张三', '李四', '王五', '赵六'],  
    '部门': ['人力资源', '信息技术', '财务', '市场营销'] 
})  
  
# 创建第二个DataFrame:部门信息表  
df2 = pd.DataFrame({  
    '部门ID': [101, 102, 103, 104],  
    '部门': ['人力资源', '信息技术', '财务', '法务'],
    '地点': ['河南', '湖北', '北京', '黑龙江']   
})  
  
# 显示两个DataFrame的内容  
print("df1:")  
print(df1)  
print("\ndf2:")  
print(df2)

结果:

2、内连接(Inner Join)

内连接仅返回两个DataFrame中都有的行,即基于共同列(这里是Department)匹配的行。

# 使用pd.merge()实现内连接  
df_inner = pd.merge(df1, df2, on='部门', how='inner')  
  
# 显示结果  
print("内连接结果:")  
print(df_inner)

测试结果:

3、左连接(Left Join)

左连接返回左DataFrame(df1)的所有行,如果右DataFrame(df2)中没有匹配的行,则结果中这部分的值为NaN。

# 实现左连接  
df_left = pd.merge(df1, df2, on='部门', how='left')  
  
# 显示结果  
print("左连接结果:")  
print(df_left)

测试结果:

4、右连接(Right Join)

右连接与左连接相反,返回右DataFrame(df2)的所有行。

# 实现右连接  
df_right = pd.merge(df1, df2, on='部门', how='right')  
  
# 显示结果  
print("右连接结果:")  
print(df_right)

测试结果:

5、外连接(Outer Join)

外连接返回两个DataFrame中所有的行,如果某个DataFrame中没有匹配的行,则结果中这部分的值为NaN。

# 实现外连接  
df_outer = pd.merge(df1, df2, on='部门', how='outer')  
  
# 显示结果  
print("外连接结果:")  
print(df_outer)

测试结果:

四、高级Merge技巧

1、多键合并

当需要基于多个键进行合并时,可以在on参数中传入一个包含多个键名的列表,或者使用left_on和right_on分别指定左右DataFrame中的键名。

# 假设我们有两个额外的键需要合并  
df1_extra = pd.DataFrame({  
    '员工ID': [1, 2, 3, 4],  
    '姓名': ['张三', '李四', '王五', '赵六'],  
    '年份': [2020, 2020, 2021, 2021],  
    '部门': ['人力资源', '信息技术', '财务', '市场营销']  
})  
  
df2_extra = pd.DataFrame({  
    '部门ID': [101, 102, 103],  
    '部门': ['人力资源', '信息技术', '财务'],  
    '年份': [2020, 2020, 2021],  
    '地点': ['河南', '湖北', '北京']   
})  
  
# 使用多键合并  
df_multi = pd.merge(df1_extra, df2_extra, on=['部门', '年份'])  
  
# 显示结果  
print("多键合并结果:")  
print(df_multi)

测试结果:

2、索引合并

在某些情况下,我们可以使用索引作为合并的键。这可以通过设置left_index或right_index参数为True来实现。

import pandas as pd  
  
# 创建第一个DataFrame:员工信息表(使用员工ID作为索引)  
df1_index = pd.DataFrame({  
    '姓名': ['张三', '李四', '王五'],  
    '部门': ['人力资源', '信息技术', '财务']  
}, index=[1, 2, 3])  
  
# 创建第二个DataFrame:员工薪资表(也使用员工ID作为索引)  
df2_index = pd.DataFrame({  
    '年薪': [50000, 60000, 70000]  
}, index=[1, 2, 4])  # 注意这里索引4在df1_index中不存在  
  
# 使用索引合并两个DataFrame  
# how参数默认为'inner',表示只保留两个DataFrame中都有的索引  
df_index_merge_inner = pd.merge(df1_index, df2_index, left_index=True, right_index=True)  
  
# 如果想要保留左DataFrame(df1_index)中的所有索引,即使右DataFrame(df2_index)中没有对应的值  
df_index_merge_left = pd.merge(df1_index, df2_index, left_index=True, right_index=True, how='left')  
  
# 显示索引合并的结果  
print("索引合并(内连接):")  
print(df_index_merge_inner)  
print("\n索引合并(左连接):")  
print(df_index_merge_left)  
  
# 注意:在左连接中,对于df1_index中存在但df2_index中不存在的索引(如索引3),  
# 结果DataFrame中对应的年薪列将包含NaN值。

测试结果:

3、解决合并中的列名冲突

在进行DataFrame合并时,尤其是当两个DataFrame中存在相同列名但表示不同数据的情况时,合并后的DataFrame将默认保留这些重名的列,这可能会导致列名冲突和数据混淆。为了解决这个问题,Pandas的merge函数提供了suffixes参数,允许我们为在合并过程中重名的列添加后缀,以区分它们来自哪个原始DataFrame。

假设我们有两个DataFrame,df_sales_2020和df_sales_2021,它们都包含了相同的产品ID和销售额列,但我们想要将它们合并到一个DataFrame中以进行比较。

import pandas as pd  
  
# 创建df_sales_2020  
df_sales_2020 = pd.DataFrame({  
    '产品ID': ['A', 'B', 'C'],  
    '销售额': [100, 200, 150]  
})  
  
# 创建df_sales_2021  
df_sales_2021 = pd.DataFrame({  
    '产品ID': ['A', 'B', 'D'],  
    '销售额': [120, 220, 170]  
})  
  
# 使用merge函数合并两个DataFrame,并解决列名冲突  
# 为来自df_sales_2020的销售额添加后缀'_2020',为来自df_sales_2021的销售额添加后缀'_2021'  
df_merged = pd.merge(df_sales_2020, df_sales_2021, on='产品ID', suffixes=('_2020', '_2021'))  
  
# 显示合并后的结果  
print(df_merged)

执行上述代码后,将打印出合并后的DataFrame,其中销售额列被区分为了销售额_2020和销售额_2021,分别表示2020年和2021年的销售额。效果如下:

注:在Pandas的merge函数中,如果没有明确指定how参数,它将默认为inner。
请注意,由于产品ID列在两个DataFrame中都是唯一的标识,并且我们在合并时使用了on='产品ID'参数,所以合并后的DataFrame中只保留了这一列作为合并键。对于其他重名的列(在这里是销售额列),我们通过suffixes参数为它们添加了不同的后缀,以区分它们各自的数据来源。这样,我们就可以清晰地看到每个产品在不同年份的销售额了。

至此,关于Pandas如何实现数据的Merge的内容全部介绍完毕,下一篇我们继续学习Panda如何实现数据Concat合并。

转载请注明出处:https://guangzai.blog.csdn.net/article/details/141500683

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JAVA基础】四则运算符

文章目录 四则运算结合运算符自增运算符关系和boolean运算符 四则运算 在java当中,使用运算符、-、*、/ 表示加减乘除,当参与 / 运算的两个操作数都是整数的时候,表示整数除法;否则表示浮点数。整数的求余操作用 % 表示。 Syste…

【Java】/* 与树有关的一些概念 */

一、关于树的一些概念 1. 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看 起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:…

记录一次经历:使用flask_sqlalchemy集成flask造成循环导入问题

前言: 工作需求,写一个接口,用Python来编写,我首先想到用flask小型框架来支撑,配置sqlalchemy来实现,但是在实现的过程中,发生循环导入问题 我想到用蓝图来解决此问题,但是仍然会出死…

UI测试使用webdriver-manager免安装浏览器驱动

引言: selenium传统的方式是下载浏览器对应的driver(驱动),放到本地的指定位置,然后写代码加载这个driver(驱动)再执行相应的操作。 弊端: 传统方法存在两个麻烦的地方: 1.需要下…

安全面试常见问题任意文件下载

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 1.1 任意文件下…

Git的使用教程及常用语法03

七.如何从版本库中删除文件 第一种方式:直接在工作区删除文件,然后提交 rm ffile1.txt (注意:这个不是git命令,而是linux命令) 看到状态发现,文件file1.txt已经被删除,提示需要提交到暂存区。 因为我们只…

蓝牙对象交换协议(OBEX) - 概念介绍

零.声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。 第二篇:Trans…

SpringBoot集成kafka-监听器注解

SpringBoot集成kafka-监听器注解 1、application.yml2、生产者3、消费者4、测试类5、测试 1、application.yml #自定义配置 kafka:topic:name: helloTopicconsumer:group: helloGroup2、生产者 package com.power.producer;import com.power.model.User; import com.power.uti…

Windows系统上进行项目管理工具VisualSVN Server服务端的保姆级安装教程与配置和SVN客户端保姆级安装教程和使用

一、VisualSVN Server简介 Subversion Server for Windows | VisualSVN ServerGet an easy to use Subversion (SVN) server for Windows. It works out-of-the-box and is suitable both for small business and enterprises. Available for free!https://www.visualsvn.com/…

4.Redis单线程和多线程

1.Redis的单线程 Redis的单线程主要是指Redis的网络IO和键值对读写是由一个线程完成的,Redis在处理客户端的请求时包括获取(Socket读)、解析、执行、内容返回(Socket写)等都由一个顺序串行的主线程处理,这…

Linux 下命令行参数和环境变量

Linux 下命令行参数和环境变量 命令行参数为什么要有命令行参数谁可以做到结论 环境变量一些现象查看环境变量添加环境变量添加内存级环境变量永久有效 其他环境变量HOMEPWDSHELLHISTSIZE 自定义环境变量定义取消 本地变量整体理解环境变量环境变量的组织方式Linux 代码获取环境…

SpringBoot集成kafka接收对象消息

SpringBoot集成kafka接收对象消息 1、生产者2、消费者3、工具类4、消息实体对象5、配置文件6、启动类7、测试类8、测试结果 1、生产者 package com.power.producer;import com.power.model.User; import com.power.util.JSONUtils; import org.springframework.kafka.core.Kaf…

UEStudio V24 中文授权版

UEStudio是一款集成开发环境(IDE)软件,主要用于编写和编辑各种类型的代码,包括C/C、Java、HTML、PHP、Perl、Python等。 软件截图: 使用说明: 解压后,双击start_UEStudio.bat来运行软件 下载地…

【计算机组成原理】计算机系统概述<1>

学习目标: 掌握计算机组成原理的基础知识巩固 例如: 信息化世界的组成 计算机系统概述 计算机硬件基本组成 各个硬件的工作原理 计算机软件 计算机系统的多层次结构 计算机系统的工作原理 计算机性能指标 学习内容: 1.0、初入计算机组成原…

Apollo9.0 PNC源码学习之Planning模块—— Lattice规划(七):横纵向运动轨迹的优选

参考文章: (1)Apollo6.0代码Lattice算法详解——Part 7: 获得最优轨迹 (2)Lattice算法详解 0 前言 // 优选出cost最小的trajectory// 7. always get the best pair of trajectories to combine; return the first// collision-free trajectory.size_t constraint_failure…

Latent-OFER:使用潜在向量进行检测、屏蔽和重建,以实现遮挡的面部表情识别

论文:Latent-OFER: Detect, Mask, and Reconstruct with Latent Vectors for Occluded Facial Expression Recognition 摘要:所提出的方法Latent-OFER可以检测遮挡,将面部被遮挡的部分恢复为未被遮挡的部分,并识别它们&#xff0…

【Java自动化学习】Web自动化

一、环境安装 环境搭建安装见此博客文章链接:https://blog.csdn.net/qq_73471456/article/details/130836494 二、元素定位、等待方式 见此之前的博客文章:selenium操作使用方式 三、下拉框定位 四、iframe 切换元素定位 注意事项:连续定…

数学排列组合

我突然想发一篇文章(别问我为什么[doge]) 排列组合大家都听过吧,今天的主角就是排列组合。 废话不多说,直接开始 先来看几道题目: :由1,2,3,4组成不同的三位数有几种? :有四个人,每两个人都要握手一次,要握…

【秋招笔试】8.24美团秋招(算法岗)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

[JAVA] 什么是Java线程同步机制?

在单线程程序中,每次只能做一件事情,后面的事情需要等待前面的事情完成后才可以进行,如果使用多线程程序,就会发生两个线程抢占资源的问题,所以在多线程编程中,需要防止这些资源访问的冲突,Java…