目录
准备工作
我准备了两个表格数据,以此展示本期的表格的合并的工作。数据示例如下:
表格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)