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

接上篇《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

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光仔December

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值