这个Merge函数功能比较强大;
如果我有两个表;
这两个表之间存在关联;
通过关联的键生成一个新的表;
比如有这样两个表:
一个表包含教师ID,每个教师ID都对应多门课程;
另一个表包含课程与班级的对应关系,就是每门课程与哪些班级对应(因为一门课程可以有多个班来上);
那么我要知道每个教师都需要给哪些班级上课,就可以用Merge这个函数了;
观察两个表,它们之间的键是课程,通过课程就可以找到教师与班级的对应关系了;
教师表:

教师授课表:

代码:
import pandas as pd
path = 'data/Merge函数.xlsx'
# 读取教师表
df_teachers = pd.read_excel(path, sheet_name='教师表')
# 读取教师授课表
df_courses = pd.read_excel(path, sheet_name='教师授课表')
# 通过两个表里的USER_ID来为每门课程添加教师姓名
df_teachers_and_courses = pd.merge(df_teachers, df_courses, left_on='USER_ID', right_on='USER_ID', how='inner')
print(df_teachers_and_courses)
输出:
USER_ID 姓名 科目
0 1 张三 科目1
1 1 张三 科目2
2 2 李四 科目3
3 2 李四 科目4
4 2 李四 科目5
5 3 王五 科目6
6 4 刘六 科目7
7 4 刘六 科目8
8 4 刘六 科目9
9 5 贾七 科目10
10 5 贾七 科目11
参数"inner"是内连接,就是说如果存在就匹配过来,不存在就舍弃;
让我对数据做个修改,再看一下就清楚了;

新增一个叫“周八”的教师;

这边科目对应的USER_ID在“教师表”中是没有的,让我再运行一下刚才的程序:
USER_ID 姓名 科目
0 1 张三 科目1
1 1 张三 科目2
2 2 李四 科目3
3 2 李四 科目4
4 2 李四 科目5
5 3 王五 科目6
6 4 刘六 科目7
7 4 刘六 科目8
8 4 刘六 科目9
9 5 贾七 科目10
10 5 贾七 科目11
可以看到结果还是一样的;
如果我把参数"inner"改为“outer",再次运行程序:
USER_ID 姓名 科目
0 1 张三 科目1
1 1 张三 科目2
2 2 李四 科目3
3 2 李四 科目4
4 2 李四 科目5
5 3 王五 科目6
6 4 刘六 科目7
7 4 刘六 科目8
8 4 刘六 科目9
9 5 贾七 科目10
10 5 贾七 科目11
11 6 周八 NaN
12 7 NaN 科目12
13 7 NaN 科目13
这样,所有数据都被提取出来了;
没有匹配到的用”NaN“表示;
这个功能是非常强大也经常使用的;
类似于Excel里面的VLOOKUP函数,但是要强大得多,我们可以对N张表格进行遍历匹配,无论是效率还是方便程度,在大数据量和多张表格时都是都是VLOOKUP函数无法发相比的;
网友评论