DataFrame多表合并拼接函数concat、merge参数详解+代码操作展示

简介: DataFrame多表合并拼接函数concat、merge参数详解+代码操作展示

前言


此篇文章接上两篇基础篇章:


一文速学-数据分析之Pandas数据结构和基本操作代码


DataFrame行列表查询操作详解+代码实战


第一章详细介绍了Series和DataFrame作为两种Pandas基本数据结构中的创建、转换和操作。第二章则详细介绍DataFrame行列表查询操作。本打算把DataFrame行列表操作一章讲清楚但是可能看起来的话会很多不容易一下记住,故分为两篇好区分记忆得更加清楚。


创建演示DataFrame


data = {'name': ['user1', 'user2', 'user3', 'user4', 'user5'],
        'old': [21, 18, 22, 28, 26],
        'weight': [124, 124, 102,107,121]
        }
test_DataFrame1= pd.DataFrame(data)
test_DataFrame1

5b39a47482754b9b89c4bcd8253b2f38.png


data = {'name': ['user1', 'user3', 'user5', 'user6', 'user7'],
        'old': [21, 22, 26, 30, 31],
        'high': [171, 165, 180,175,159]
        }
test_DataFrame2= pd.DataFrame(data)
test_DataFrame2


合并函数


1.concat


其他语言中都有concat函数,在C语言中为字符串拼接,在SQL中也为字符串拼接,而在Pandas中相当于数据库中的全连接(Union all):沿着一条轴,将多个对象堆叠到一起,大家不要搞混了。与数据库不同的是,它不会去重,但是可以使用drop_duplicates方法达到去重的效果。


语法如下:


concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, 
       keys=None, levels=None, names=None, verify_integrity=False, copy=True): 

官网:pandas.concat

a2de45123d554a9a8b310e1d618f682d.png


参数解释:


objs:Series,DataFrame或Panel对象的序列或映射,也就是连接的两个对象。

axis:默认为0,0为行拼接,1为列拼接,意为沿着连接的轴。

join:{'inner','outer'},默认为“outer”。如何处理其他轴上的索引。outer为并集和inner为交集。

ignore_index:boolean,default False。如果为True,不使用合并后的索引值。结果轴将被标记为0,...,n-1。其他轴上的索引值在连接中仍然存在。

join_axes:Index对象列表。用于其他n-1轴的特定索引,而不是执行内部/外部设置逻辑。

keys:序列,默认值无。使用传递的键作为最外层构建层次索引。如果为多索引应为元组。

levels:序列列表,默认值无。用于构建MultiIndex的特定级别(唯一值)。否则,它们将从键推断。

names:list,默认值无。结果层次索引中的级别的名称。

verify_integrity:boolean,default False。检查新连接的轴是否包含重复项。

copy:boolean,默认值True。如果为False,请勿不必要地复制数据。

直接使用concat不加参数时为:


pd.concat([test_DataFrame1,test_DataFrame2])

10c423f710724460a70d5a2820de056a.png


此时axis默认为0则为行连接,该为axis为1时:


pd.concat([test_DataFrame1,test_DataFrame2],axis=1)


33ec84951e234b2b9df4f24b0560d90d.png

行数不变列增加。改变join为交集时仅与有相同列合并其他删除:


pd.concat([test_DataFrame1,test_DataFrame2],axis=0,join='inner')


eb7d61d435e14028a2a828e7b633a8ba.png


同理axis为1时也一样仅看行索引是否相同


pd.concat([test_DataFrame1,test_DataFrame2],axis=1,join='inner')

01d8efaf42c2431087786150a4268f91.png

新版本的pandas已经删除了join_axes,这一功能可以用merge代替。


而ignore_index就是把索引index对应替换掉:


pd.concat([test_DataFrame1,test_DataFrame2],axis=0,join='outer',ignore_index=True)

77ef61fd1e0649a48fc3f440a8c98bfa.png


2.merge


merge更像是SQL关系数据库那样根据表中相应的键来连接数据库,类似join。

语法如下:

merge(left, right, how='inner', on=None, left_on=None, right_on=None,  
      left_index=False, right_index=False, sort=True,  
      suffixes=('_x', '_y'), copy=True, indicator=False)

官网:pandas.merge


26ae71a5e4d14be58a9a307b9c3829b7.png


参数说明:


left:参与合并的左侧DataFrame

right:参与合并的右侧DataFrame

how:{inner、outer、left、right}default为inner为交集。

on:用于连接的列名。该列名就像连接的两张表中共同的特征。类似按键合并多表。如果未制定,且其他连接键也没用制定,则以left和right列名的交集为连接键,也就是inner连接。

left_on:左侧DataFrame中用作连接键的列

right_on:右则DataFrame中用作连接键的列

left_index:使用左则DataFrame中的行索引做为连接键

right_index:使用右则DataFrame中的行索引做为连接键

sort:默认为True,将合并的数据进行排序。在大多数情况下设置为False可以提高性能

suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为('_x','_y')。如果两个DataFrame对象都有“Data”,则结果中就会出现“Data_x”和"Data_y“

copy:默认为True,总是将数据复制到数据结构中;大多数情况下设置为False可以提高性能

indicator:显示合并数据中数据的来源情况


仍然是之前两个DataFrame,默认效果为:

pd.merge(test_DataFrame1,test_DataFrame2)

2702826972b348fa89735b84dc8fef2e.png


该为交集则根据index合并,若没有的索引值则会自动NaN填补:


pd.merge(test_DataFrame1,test_DataFrame2,how='outer')


5f55e5a83e5147b39aeafa587522559d.png


若想指定特定列名进行索引,则需要on函数:


pd.merge(test_DataFrame1,test_DataFrame2,how='outer',on='name')


7b59c5bc565b49fcb1d6e87c577e5beb.png


如果两个DataFrame对象都有“old”,则结果中就会出现“old_x”和"old_y“

若是两表中列名不一样,如创建一个DataFrame3:

83194b2d02bd42d7b5c487a4f6a50015.png

想要和DataFrame1合并时可以使用left_on和right_on:


pd.merge(test_DataFrame1,test_DataFrame3,how='outer',left_on=['name'],right_on=['user'])


69d9293592bc4fd4b25da3e8f973832d.png


行就不展示了效果一样,sort排序:


pd.merge(test_DataFrame1,test_DataFrame2,how='outer',sort=True)


1300cdb2e31e46209e7fa6162964d54a.png


目录
相关文章
|
6月前
|
Python
DataFrame合并和连接案例解析
【4月更文挑战第9天】该文介绍了Pandas中DataFrame的合并与连接。通过创建两个DataFrame `df1` 和 `df2`,分别展示其内容,然后利用`merge()`方法按姓名列合并,生成包含共同姓名的完整信息的新DataFrame。此外,还使用`concat()`方法将两个DataFrame沿垂直方向(axis=0)连接,形成一个包含所有原始数据的新DataFrame。
82 2
|
Python
使用`merge`函数将两个dataframe合并在一起,然后使用`query`函数根据指定的条件选取数据
在pandas中,可以使用`merge`函数将两个dataframe合并在一起,然后使用`query`函数根据指定的条件选取数据。
119 1
【Stata】append和merge的区别
【Stata】append和merge的区别
430 0
|
3月前
|
数据处理
R语言数据合并:掌握`merge`与`dplyr`中`join`的巧妙技巧
【8月更文挑战第29天】如果你已经在使用`dplyr`进行数据处理,那么推荐使用`dplyr::join`进行数据合并,因为它与`dplyr`的其他函数(如`filter()`、`select()`、`mutate()`等)无缝集成,能够提供更加流畅和一致的数据处理体验。如果你的代码中尚未使用`dplyr`,但想要尝试,那么`dplyr::join`将是一个很好的起点。
|
5月前
|
关系型数据库 MySQL PHP
【thinkphp知识】thinkphp 使用union链式操作合并两个或多个 SELECT 语句的结果集,新增不存在的字段,并赋予默认值
【thinkphp知识】thinkphp 使用union链式操作合并两个或多个 SELECT 语句的结果集,新增不存在的字段,并赋予默认值
59 0
|
数据处理 索引 Python
pandas数据处理之数据转换(映射map、替换replace、重命名rename)
我们在数据处理的过程中经常碰到需要对数据进行转换的工作,比如将原来数据里的字典值根据字典转义成有意义的说明,将某些数据转换成其他的数据,将空值转换成其他值,将数据字段名进行重命名等。pandas作为数据处理分析的利器当然为上述的这些数据转换提供了便捷的方法。我们可以利用pandas提供的映射、替换、重命名等操作方便的进行相应的数据转换操作。 本文通过实例重点介绍pandas常用的数据转换工具映射map()、替换replace()、重命名rename()
294 0
|
前端开发 关系型数据库 MySQL
数据合并与分隔:解析MySQL中的GROUP_CONCAT()函数
在数据库管理中,将多行数据合并成一行并以特定分隔符进行分隔,常用于生成逗号分隔的列表等情况。GROUP_CONCAT()函数就是帮助我们实现这一目标的工具。
677 0
|
Python
【Pandas】解析resample函数中重采样频率‘freq‘用法(附参数说明表)
【Pandas】解析resample函数中重采样频率‘freq‘用法(附参数说明表)
687 0
【Pandas】解析resample函数中重采样频率‘freq‘用法(附参数说明表)
|
SQL 数据挖掘 关系型数据库
5个例子介绍Pandas的merge并对比SQL中join
5个例子介绍Pandas的merge并对比SQL中join
173 0
5个例子介绍Pandas的merge并对比SQL中join
|
SQL 关系型数据库 MySQL
索引合并Intersection、union (3)--单表访问方法(三十八)
索引合并Intersection、union (3)--单表访问方法(三十八)