【Python处理EXCEL】基础操作篇3:用Python对Excel表格进行拼接合并

目录

准备工作

一、横向拼接

1.1 一般拼接

1.2 指定键进行拼接,即指定某一列作为两个表的连接依据。

1.2.1 多对一

1.2.2 多对多

1.2.3 用on来指定多个连接键

1.2.4 指定左右连接键

1.2.5 索引当作连接键

1.3 连接的方式

1.3.1 内连接(inner)

1.3.2 左连接(left)

1.3.3 右连接(right)

1.3.4 外连接(outer)

二、纵向拼接

2.1 普通合并

2.2 重叠数据的合并

三、整合代码


准备工作

我准备了两个表格数据,以此展示本期的表格的合并的工作。数据示例如下:

表格1

表格2

接着将这两个表格的数据分别导入python中,导入代码入下:

import pandas as pd
df1=pd.read_excel(r"D:\杂货\展示数据1.xlsx",sheet_name='Sheet1')
df2=pd.read_excel(r"D:\杂货\展示数据2.xlsx",sheet_name='Sheet1')

 具体的导入方法和以上使用到的pandas库的安装在前章我已有介绍,不再赘述,请转至:

https://blog.csdn.net/Deng333333555/article/details/125092526?spm=1001.2014.3001.5501

本篇涉及到一些基础的表格数据的概念,而对于“索引”的相关知识可以看之前写的“基础操作篇2”,里面有相关的介绍,可以帮助理解“索引”的含义。相关可转至以下连接:

https://blog.csdn.net/Deng333333555/article/details/125138116?spm=1001.2014.3001.5501 

一、横向拼接

1.1 一般拼接

首先我们先看一下合并前的表格1和表格2的数据样式:

 这两个表格存在公共列,为列索引为“学号”的那一列。

合并代码如下:

merge_1=pd.merge(df1,df2)#df1与df2分别为要合并的两个表格
print(merge_1)

此时程序会自己寻找两个表的公共列,依照公共列进行拼接。(公共列:有相同的列)

 合并后的数据如上图所示。

1.2 指定键进行拼接,即指定某一列作为两个表的连接依据。

1.2.1 多对一

多对一的情况下的列表数据大致为一下形式:

 可以看到,上面为列表1,下面为列表2,列表1的“学号”那一列的数据都是“唯一的”,即分别只有一个100,101,102,103,没有重复值;而在列表2中,“学号”那一列的数据就有重复值,即有两个100,101等。这种情况下,将列表2合并到列表1中就叫作多对一的合并。

合并代码如下:

merge_2=pd.merge(df1,df2,on="学号")#on="学号"即是说依照学号那一列进行合并
print(merge_2)

1.2.2 多对多

多对多情况下的数据样式如下:

 由上图可知,多对多即是列表1与列表2中“学号”列都有重复项。合并代码如下:

merge_3=pd.merge(df1,df2)
print(merge_3)

 合并后的表格如下:

1.2.3 用on来指定多个连接键

原数据样式如下:

 上面为表格1,下面为表格2(即df1和df2)

由1.2.1一处已经了解到,可以通过on="学号"来指定某个连接键,而当需要指定多个连接键时,同样也是使用on来实现。代码如下:

merge_4=pd.merge(df1,df2,on=['姓名','学号'])#语法为on=[]
print(merge_4)

合并后的列表如下:

1.2.4 指定左右连接键

合并前的数据样式为:

 以上为两个待拼接的表格。

当要连接的两个表之间没有公共列时(实际值一样,但列名不同),则可通过左右连接键拼接两个表。其中left_on用来指明左表的连接键的列名,right_on用来指明右表的连接键的列名。具体看如下示,代码如下:

merge_5=pd.merge(df1,df2,left_on="编号",right_on='学号')
print(merge_5)

执行代码,合并后的列表如下:

1.2.5 索引当作连接键

从上面的表格数据中可以看到,其索引列为最左边的那几个数字,0,1,2,3……。但有时候我们会需要用某一列的内容作为索引列,此时可以通过以下代码将索引列替换掉:

change=df1.set_index("编号")
print(change)

转换索引列前的列表样式如下:

 转换之后索引列的列表样式如下:

不难发现最左边的那一列的索引有所不同。(注意:此时待合并的列表1与列表2的索引已经不同了)

接下来我们可以通过以下代码依据索引来进行列表的合并:

merge_6=pd.merge(df1,df2,left_index=True,right_index=True)
print(merge_6)

合并后的列表样式如下:

1.3 连接的方式

1.3.1 内连接(inner)

内连接就是取两个表中的共同拥有的内容,而若不是共同拥有的内容的话,在内连接后形成的新的表格会将非共同拥有的内容“删除”,只保留共同拥有的内容。

合并前的两个列表样式如下:

 内连接的代码如下:

merge_7=pd.merge(df1,df2,on='学号',how='inner')
print(merge_7)

 合并后的表格如下:

1.3.2 左连接(left)

以左表为基础,右表往左表上拼接。当遇到左(右)表有,而右(左)表没有的内容,空缺的部分则会以NaN的方式填充。

合并前的两个列表样式如下:

 合并代码如下:

merge_8=pd.merge(df1,df2,on='学号',how='left')
print(merge_8)

 合并后表格如下:

1.3.3 右连接(right)

以右表为基础,左表往右表上拼接。其他与左连接同理。

1.3.4 外连接(outer)

取两个表的并集。

合并代码如下:

merge_9=pd.merge(df1,df2,on='学号',how='outer')
print(merge_9)

 合并前表格如下:

合并后表格如下:

二、纵向拼接

2.1 普通合并

合并前表格如下:

代码如下:

merge_x=pd.concat([df1,df2])
print(merge_x)

合并后表格如下:

注意:纵向拼接的concat中使用的是列表,和merge的形式有所不同。

索引设置:普通合并的方法中,合并后的表格是保留原索引的,如上图所,编号处的数字索引是重复的。而为了解决这个问题,我们通常会需要对索引进行设置。

合并代码如下:

merge_x=pd.concat([df1,df2],ignore_index=True)
print(merge_x)

合并后表格如下:

通过ignore_index=True设置的拼接表格后,可以发现最左边的编号索引编程了顺序数字。

2.2 重叠数据的合并

在未处理重叠数据的合并形式下,如果两个表格中出现相同的数据内容,那么在合并后的新表格中会出现多条数据重复的情况,为解决这个问题,我们可以进行如下处理:

合并前的表格:

 通过以下代码合并:

merge_y=pd.concat([df1,df2],ignore_index=True).drop_duplicates()
print(merge_y)

合并后的表格如下:

此时程序会自动地将重复项合二为一。从合并前后的表格对比可知,合并前有两个“王五”的内容

,合并后两个“王五”合二为一。

三、整合代码

import pandas as pd

df1=pd.read_excel(r"D:\杂货\展示数据1.xlsx",sheet_name='Sheet1')
df2=pd.read_excel(r"D:\杂货\展示数据2.xlsx",sheet_name='Sheet1')
print(df1)
print(df2)

merge_1=pd.merge(df1,df2)#一般横向拼接
print(merge_1)

merge_2=pd.merge(df1,df2,on="学号")#指定连接键
print(merge_2)

merge_3=pd.merge(df1,df2)
print(merge_3)

merge_4=pd.merge(df1,df2,on=['姓名','学号'])#指定多个连接键
print(merge_4)

merge_5=pd.merge(df1,df2,left_on="编号",right_on='学号')#指定左右连接键
print(merge_5)

change=df1.set_index("编号")#重置索引
print(change)
merge_6=pd.merge(df1,df2,left_index=True,right_index=True)#依照索引拼接
print(merge_6)

merge_7=pd.merge(df1,df2,on='学号',how='inner')#内连接
print(merge_7)

merge_8=pd.merge(df1,df2,on='学号',how='left')#左连接
print(merge_8)

merge_9=pd.merge(df1,df2,on='学号',how='outer')#外连接
print(merge_9)

merge_x=pd.concat([df1,df2],ignore_index=True)#一般纵向拼接
print(merge_x)

merge_y=pd.concat([df1,df2],ignore_index=True).drop_duplicates()#纵向拼接并重置索引
print(merge_y)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值