第4节,pandas根据某一列合并excel数据

有两份excel, 分别记录学生的基础信息和在校信息,如下图所示

现在需要你将这两份表格合并成一份,与上一节的合并excel不同,这两份excel的列是不相同的,但都有学号这一列,学号相同,说明是同一个人。同一个人的信息被拆分到了两个excel中,下面使用pandas 将其合并到一起

1. 读取excel

import pandas as pd

basic_info_df = pd.read_excel("./data/学生信息1.xlsx", sheet_name="学生基本信息")
school_info_df = pd.read_excel("./data/学生信息2.xlsx", sheet_name="学生在校信息")

分别读取excel,返回dataframe 对象

2. 创建write对象

后面会使用4中方式对这两个df进行merge操作,我打算将merge的结果写到同一个excel的4个sheet中,因此需要创建一个以openpyxl为引擎的ExcelWriter对象,用它来实现写excel文件操作

result_file = "./data/学生信息汇总.xlsx"
writer = pd.ExcelWriter(result_file, engine='openpyxl')

3. 合并df

merge 两个df, 需要指定以哪个字段为基准进行merge, 同时要指定merge的方式,一共有四种merge方法,分别是inner, left, rigth, outer。

这两个df需要以学号为基准进行merge, 如果两份数据的学生信息里,学生的人数和学号都是相同的,那么这4种方式merge的结果也必然是相同的,但仔细观察数据你会发现,5号学生不在学生基本信息表里,而3号学生不在学校信息表里。

4种merge方式要考虑merge时哪个在左,哪个在右,现在以basic_info_df 为左侧操作对象,以school_info_df 为右侧操作对象来讲解4种merge方式的结果和计算逻辑。

使用inner方式merge的结果是

只有在两个表里都有的学生才会出现在merge结果里。

使用left方式merge的结果是

只有在学生基础信息表里的学生会出现在结果里,3号没有在校信息,因此在校信息都为空。

使用right方式merge的结果是

只有在学校信息里的学生才会出现在结果里,5号没有学生基本信息,因此这部分都是空

使用outer方式merge的结果是

所有学生的信息都会出现在结果里,缺失的部分自动填为空, 下面是实现代码

df_inner = pd.merge(basic_info_df, school_info_df, how='inner', on=['学号', '姓名'])
df_inner.to_excel(writer, sheet_name="inner方式merge", index=False)

df_left = pd.merge(basic_info_df, school_info_df, how='left', on=['学号', '姓名'])
df_left.to_excel(writer, sheet_name="left方式merge", index=False)

df_right = pd.merge(basic_info_df, school_info_df, how='right', on=['学号', '姓名'])
df_right.to_excel(writer, sheet_name="right方式merge", index=False)

df_outer = pd.merge(basic_info_df, school_info_df, how='outer', on=['学号', '姓名'])
df_outer.to_excel(writer, sheet_name="outer方式merge", index=False)

writer.save()

on参数决定以哪些里为基准进行merge,以学号就足够了,但是那样会出现两列姓名,因此把姓名列也加上,这样就唯一了。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案