任务概述
实验环境
因为我们的数据很小,所以对电脑没有过多的要求。不过因为是讲解python的库的使用,我们建立在已经对python的操作已经有了一定的基础之上。由于我的电脑过于卡顿,因此我是在google colab上进行的操作。因此推荐大家使用anaconda安装python及管理相关环境。推荐使用jupyter notebook来进行相关的操作的实验。jupyter notebook的代码编写和google colab的相关操作很相似。
这里需要注意:读取和保存文件两个部分,路径应当自作修改!
前情概要
我们已经得到了以下五个数据:
- 数据1: 学生花名册
- 数据2: 班级1文化课成绩
- 数据3: 班级1素质课成绩
- 数据4: 班级3文化课成绩
- 数据5: 班级3素质课成绩
文化课和素质课分开的。因为农村一般不上素质课,所以素质课最后的分数都是统一随便打的 。当然我们的何老师现在还不知道。他一般喜欢把数据全部处理好以后再做统计分析。
工作细析
何老师现在的工作是:分别将两个班的文化课和素质课合并在一起,这样就可以得到两个班所有的成绩在一起的表class_1_all和class_3_all。然后将两个表格连接起来,再结合花名册,将每个学生在哪个班级也添加进去。
目标样式
最后的结果应当如下所示:
表格显示不全,底部有拖动处,请左右滑动进行查看
学号 | 姓名 | 语文 | 数学 | 英语 | 音乐 | 美术 | 体育 | 班级 |
---|---|---|---|---|---|---|---|---|
A01 | 饶秀颖 | 35 | 45 | 55 | 95 | 95 | 95 | 1班 |
A02 | 于俊远 | 38 | 53 | 46 | 97 | 98 | 95 | 1班 |
A03 | 王五 | 54 | 46 | 38 | 97 | 99 | 97 | 1班 |
A08 | 冉颇 | 34 | 54 | 60 | 96 | 98 | 99 | 3班 |
A09 | 夫余岚裳 | 43 | 57 | 67 | 98 | 95 | 94 | 3班 |
A10 | 薛菁 | 55 | 60 | 65 | 96 | 93 | 96 | 3班 |
实际操作
1.导入模块
倘若没有相关的模块,请搜索安装一下两个库:pandas;pathlib
其中pandas是我们的主角,pathlib是操作文件的路径的库
import pandas as pd
# 查看pandas的版本,虽然在这里我们对版本没有具体的要求,但还是建议使用更新版的pandas,这样我们的操作能更方便。有时会遇到版本不同无法顺利处理数据的情况。
# pd.__version__
import pathlib
2.选择文件夹所在路径
# 指定五个数据所在的文件夹路径
# 这里因为我使用的是google colab,所以路径设置有些不同
# 常规的笔记本路径可以如下设置:
# path_root = r"D:\JupyterNotebook"
# 其中r表示绝对路径
path_root = "/content/drive/MyDrive/Notebooks_data/pandas_series"
path_root
out
/content/drive/MyDrive/Notebooks_data/pandas_series
3.获得每一个文件的单独路径-pathlib.Path().iterdir()
# 利用pathlib.Path可以获得这个文件夹下所有的文件的路径,但是需要使用.iterdir()显示
# 随后再使用list将之转换成列表,这样就方便指定文件
path_list = list(pathlib.Path(path_root).iterdir())
path_list
out
[PosixPath('/content/drive/MyDrive/Notebooks_data/pandas_series/03_1班素质课成绩.xlsx'), PosixPath('/content/drive/MyDrive/Notebooks_data/pandas_series/04_3班成绩_文化课成绩.xlsx'), PosixPath('/content/drive/MyDrive/Notebooks_data/pandas_series/02_1班成绩_文化课成绩.xlsx'), PosixPath('/content/drive/MyDrive/Notebooks_data/pandas_series/01_学生花名册.xlsx'), PosixPath('/content/drive/MyDrive/Notebooks_data/pandas_series/05_3班素质课成绩.xlsx')]
观察发现,pathlib.Path虽然可以一次性将所有的文件的路径得到,但是顺序并不是很顺畅
4.关键词连接表格-pd.merge()
4.1.班级1的数据连接
# 利用.read_excel读取数据
# 利用.merge智能的将两个表格连接起来
class_1_score1 = pd.read_excel(path_list[2])
class_1_score2 = pd.read_excel(path_list[0])
class_1_all = pd.merge(class_1_score1, class_1_score2)
class_1_all
out
学号 姓名 语文 数学 英语 音乐 美术 体育 0 A01 饶秀颖 35 45 55 95 95 95 1 A02 于俊远 38 53 46 97 98 95 2 A03 王五 54 46 38 97 99 97
4.2.班级3的数据连接
class_3_score1 = pd.read_excel(path_list[1])
class_3_score2 = pd.read_excel(path_list[4])
class_3_all = pd.merge(class_3_score1, class_3_score2)
class_3_all
out
学号 姓名 语文 数学 英语 音乐 美术 体育 0 A08 冉颇 34 54 60 96 98 99 1 A09 夫余岚裳 43 57 67 98 95 94 2 A10 薛菁 55 60 65 96 93 96
5.按轴向连接表格-.append()
# 两个dataframe上下拼接相连,在pandas中采用.append()方法
# 注意需要添加参数ignore_index=True,不然得到的dataframe会有重叠的索引不便于后续操作
score = class_1_all.append(class_3_all, ignore_index=True)
score
out
学号 姓名 语文 数学 英语 音乐 美术 体育 0 A01 饶秀颖 35 45 55 95 95 95 1 A02 于俊远 38 53 46 97 98 95 2 A03 王五 54 46 38 97 99 97 3 A08 冉颇 34 54 60 96 98 99 4 A09 夫余岚裳 43 57 67 98 95 94 5 A10 薛菁 55 60 65 96 93 96 倘若没有添加参数ignore_index=True,就会得到第一列重复的索引index:
学号 姓名 语文 数学 英语 音乐 美术 体育 0 A01 饶秀颖 35 45 55 95 95 95 1 A02 于俊远 38 53 46 97 98 95 2 A03 王五 54 46 38 97 99 97 0 A08 冉颇 34 54 60 96 98 99 1 A09 夫余岚裳 43 57 67 98 95 94 2 A10 薛菁 55 60 65 96 93 96
6.想所得到的表格添加其在哪一个班级
# 这一步也是使用merge()
# 我们先获得学生在哪个班级的那张表格数据
stu_names = pd.read_excel(path_list[3])
stu_names
out
班级 学号 姓名 0 1班 A01 饶秀颖 1 1班 A02 于俊远 2 1班 A03 王五 3 2班 A04 菱晗晗 4 2班 A05 耿龙 5 2班 A06 宫俊达 6 2班 A07 公金超 7 3班 A08 冉颇 8 3班 A09 夫余岚裳 9 3班 A10 薛菁
# 之所以这里添加他们在哪一个班级,是因为后面需要根据他们的成绩进行排名
# 排名之后需要知道这些学生在哪个班级,这样也方便比较两个班级的整体水平
score = score.merge(stu_names)
score
out
学号 姓名 语文 数学 英语 音乐 美术 体育 班级 0 A01 饶秀颖 35 45 55 95 95 95 1班 1 A02 于俊远 38 53 46 97 98 95 1班 2 A03 王五 54 46 38 97 99 97 1班 3 A08 冉颇 34 54 60 96 98 99 3班 4 A09 夫余岚裳 43 57 67 98 95 94 3班 5 A10 薛菁 55 60 65 96 93 96 3班
7.保存.to_excel(,index=False)
# pandas中的数据保存到一个Excel表格中可以自行搜索
# 这里添加参数index=False,是为了不保存额外的index数据
score.to_excel("/content/drive/MyDrive/Notebooks_data/score.xlsx", index=False)