问题描述
自建EXCEL文件,分为2个工作区,分别存放学生信息表(不少于30人)和班级职务表(不少于4种职务)。
如信息表:
学号 |
姓名 |
性别 |
数学 |
英语 |
Python |
通信技术 |
1001 |
张三 |
男 |
95 |
86 |
87 |
90 |
1002 |
李四 |
男 |
98 |
84 |
88 |
89 |
如班级职务表:
读取Excel文件数据表分别存入DataFrame对象Score和Duty。要求如下:
- Score对象新增一列“总分”为前四列成绩之和。
- Score对象依据“总分”列的值从高到低进行排序。
- Score对象根据性别列进行分组,输出男女生各自的平均分。
- 输出男女生的最高分。
- Score对象新增一列“等级”,总分大于360的等级为A,总分小于270的等级为C,介于270到360之间为B。
- 以“学号”列为关联关键,将Score对象和Duty对象合并,保留所有Score对象的数据行,合并声称新的DataFrame对象Students。
- 把Students对象数据存入新的Excel文件students.xlsx中。
代码实现
问题分析
- 创建EXCEL文件,分为2个工作区,分别存放学生信息表和班级职务表。
- 导入所需要的库
import pandas as pd
- 读取EXCEL文件
- 使用read_excel()函数
- 函数的具体参数
参数 |
说明 |
io |
string, path object ; excel 路径。 |
sheet_name |
string, int, mixed list of strings/ints, or None, default 0 返回多表使用sheetname=[0,1],若sheetname=None是返回全表 注意:int/string 返回的是dataframe,而none和list返回的是dict of dataframe |
header |
int, list of ints, default 0 指定列名行,默认0,即取第一行,数据为列名行以下的数据 若数据不含列名,则设定 header = None |
skiprows |
list-like,Rows to skip at the beginning,省略指定行数的数据 |
skip_footer |
int,default 0, 省略从尾部数的int行数据 |
index_col |
int, list of ints, default None指定列为索引列,也可以使用u”strings” |
names |
array-like, default None, 指定列的名字。 |
file_name = "studata.xlsx"
Score = pd.read_excel(file_name, sheet_name='Sheet1', index_col=0)
Duty = pd.read_excel(file_name, sheet_name='Sheet2', index_col=0)
Score['总分'] = Score['数学'] + Score['英语'] + Score['Python'] + Score['通信技术']
Score['总分']
- Score对象依据“总分”列的值从高到低进行排序
- 使用sort_values()函数
- 函数的具体参数
参数 |
说明 |
by |
指定列名(axis=0或’index’)或索引值(axis=1或’columns’) |
axis |
若axis=0或’index’,则按照指定列中数据大小排序;若axis=1或’columns’,则按照指定索引中数据大小排序,默认axis=0 |
ascending |
是否按指定列的数组升序排列,默认为True,即升序排列 |
inplace |
是否用排序后的数据集替换原来的数据,默认为False,即不替换 |
na_position |
{‘first’,‘last’},设定缺失值的显示位置 |
Score.sort_values(by='总分', inplace=True, ascending=False)
Score
- Score对象根据性别列进行分组
- 输出男女生各自的平均分
- 输出男女生的最高分
- 使用groupby()函数
- 具体函数的规则如下:
df.groupby([df[属性],df[属性])(指分类的属性,数据的限定定语,可以有多个).mean()(对于数据的计算方式——函数名称)
举例如下:
print(df[“评分”].groupby([df[“地区”],df[“类型”]]).mean())
#上面语句的功能是输出表格所有数据中不同地区不同类型的评分数据平均值
Score.groupby(['性别'])['总分'].mean()
Score.groupby(['性别'])['总分'].max()
- Score对象新增一列“等级”,总分大于360的等级为A,总分小于270的等级为C,介于270到360之间为B
- 自定义等级判断函数
def grade(x):
if x>=360:
return "A"
elif x>=270
return "B"
else
return "C"
- 使用apply和lambda的组合
- lambda函数也叫匿名函数,即没有具体名称的函数,它允许快速定义单行函数,可以用在任何需要函数的地方
输入是传入到参数列表x的值,输出是根据表达式(expression)计算得到的值。**
- Python中apply函数的格式为:apply(func,*args,**kwargs)
func可以是匿名函数。
Score['等级'] = Score['总分'].apply(lambda x: grade(x))
- 以“学号”列为关联关键,将Score对象和Duty对象合并,保留所有Score对象的数据行,合并声称新的DataFrame对象Students
- 使用merge()函数
- 函数的具体参数
参数 |
说明 |
how |
默认为inner,可设为inner/outer/left/right |
on |
根据某个字段进行连接,必须存在于两个DateFrame中(若未同时存在,则需要分别使用left_on和right_on来设置) |
left_on |
左连接,以DataFrame1中用作连接键的列 |
right_on |
右连接,以DataFrame2中用作连接键的列 |
left_index |
将DataFrame1行索引用作连接键 |
right_index |
将DataFrame2行索引用作连接键 |
sort |
根据连接键对合并后的数据进行排列,默认为True |
suffixes |
对两个数据集中出现的重复列,新数据集中加上后缀_x,_y进行区别 |
Students = pd.merge(Score, Duty, on='学号')
- 把Students对象数据存入新的Excel文件students.xlsx中
- 使用to_excel()函数
- 函数的具体参数
参数 |
说明 |
excel_writer |
字符串或ExcelWriter 对象,文件路径或现有的ExcelWriter |
sheet_name |
字符串,默认“Sheet1”,将包含DataFrame的表的名称。 |
na_rep |
字符串,默认‘ ’,缺失数据表示方式 |
float_format |
字符串,默认None,格式化浮点数的字符串 |
columns |
序列,可选,要编写的列 |
header |
布尔或字符串列表,默认为Ture。写出列名。如果给定字符串列表,则假定它是列名称的别名。 |
index |
布尔,默认的Ture,写行名(索引) |
index_label |
字符串或序列,默认为None。如果需要,可以使用索引列的列标签。如果没有给出,标题和索引为true,则使用索引名称。如果数据文件使用多索引,则需使用序列。 |
startrow |
左上角的单元格行来转储数据框 |
startcol |
左上角的单元格列转储数据帧 |
engine |
字符串,默认没有使用写引擎 - 您也可以通过选项io.excel.xlsx.writer,io.excel.xls.writer和io.excel.xlsm.writer进行设置。 |
merge_cells |
布尔,默认为Ture编码生成的excel文件。 只有xlwt需要,其他编写者本地支持unicode。 |
inf_rep |
字符串,默认“正”无穷大的表示(在Excel中不存在无穷大的本地表示) |
freeze_panes |
整数的元组(长度2),默认为None。指定要冻结的基于1的最底部行和最右边的列 |
Students.to_excel('students.xlsx')
完整代码
import pandas as pd
def grade(x):
if x>=360:
return "A"
elif x>=270:
return "B"
else:
return "C"
file_name = "studata.xlsx"
Score = pd.read_excel(file_name, sheet_name='Sheet1', index_col=0)
Duty = pd.read_excel(file_name, sheet_name='Sheet2', index_col=0)
Score['总分'] = Score['数学'] + Score['英语'] + Score['Python'] + Score['通信技术']
Score['等级'] = Score['总分'].apply(lambda x: grade(x))
Score.sort_values(by='总分', inplace=True, ascending=False)
print('男女生的平均分为:')
print(Score.groupby(['性别'])['总分'].mean())
print('男女生的最高分为:')
print(Score.groupby(['性别'])['总分'].max())
Students = pd.merge(Score, Duty, on='学号')
Students.to_excel('students.xlsx')
参考文章
8行Python代码实现excel两个sheet表合并
用Python将同一个excel中的多个sheet合并成一个sheet
python读取excel指定列名,dataframe连接,两列相减作为第三列的值
python学习002-pandas VS excel给成绩赋值等级
python:从excel文件中读取成绩,计算出平均成绩,按平均成绩降序输出,并写回到excel文件
PYTHON作业——用函数获取EXCEL中的学生成绩并做处理
pandas——很全的groupby、agg,对表格数据分组与统计