【Python数据分析学习实例】对学⽣成绩单和信息进⾏整合以及数据分析问题描述
⾃建EXCEL⽂件,分为2个⼯作区,分别存放学⽣信息表(不少于30⼈)和班级职务表(不少于4种职务)。
如信息表:
学号姓名性别数学英语Python通信技术1001张三男95868790
1002李四男98848889
如班级职务表:
学号职务
1001班长
1002学习委员
读取Excel⽂件数据表分别存⼊DataFrame对象Score和Duty。要求如下:
1. Score对象新增⼀列“总分”为前四列成绩之和。
2. Score对象依据“总分”列的值从⾼到低进⾏排序。
3. Score对象根据性别列进⾏分组,输出男⼥⽣各⾃的平均分。
4. 输出男⼥⽣的最⾼分。
5. Score对象新增⼀列“等级”,总分⼤于360的等级为A,总分⼩于270的等级为C,介于270到360之间为B。
6. 以“学号”列为关联关键,将Score对象和Duty对象合并,保留所有Score对象的数据⾏,合并声称新的DataFrame对象
Students。
7. 把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⾏数据
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"# 定义⽂件路径,这⾥我是将代码和EXCEL放在了同⼀个⽂件夹下,如不在同⼀⽂件夹应写成C:/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['英语']+ Score['Python']+ Score['通信技术']# 新增⼀列“总分”为成绩之和
]
Score['总分'
使⽤sort_values()函数python数组合并
函数的具体参数
参数说明
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()函数
具体函数的规则如下:
print(df[“评分”].groupby([df[“地区”],df[“类型”]]).mean())
#上⾯语句的功能是输出表格所有数据中不同地区不同类型的评分数据平均值
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和ri
ght_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的最底部⾏和最右边的列
<_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"# 定义⽂件路径,这⾥我是将代码和EXCEL放在了同⼀个⽂件夹下,如不在同⼀⽂件夹应写成C:/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('男⼥⽣的平均分为:')
upby(['性别'])['总分'].mean())# 输出男⼥⽣各⾃的平均分
print('男⼥⽣的最⾼分为:')
upby(['性别'])['总分'].max())# 输出男⼥⽣的最⾼分
Students = pd.merge(Score, Duty, on='学号')# 以“学号”为关联关键,合并sheet1和sheet2
<_excel('students.xlsx')
参考⽂章
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论