将Excel中的的数据读入数据框架DataFrame后,可以非常方便的进行各种数据处理。 21。1列间求和 求总分(总分语文数学英语) 对于上一章所提到的学生成绩表,仅用一个语句即可完成总分计算,并填充。 df〔总分〕df〔语文〕df〔数学〕df〔英语〕 完整代码如下: frompandasimportreadexcel filed:student。xlsx见第18章表181 dfreadexcel(file,sheetname0,converters{学号:str}) df〔总分〕df〔语文〕df〔数学〕df〔英语〕 print(df。head())df。head()的作用是仅显示5行记录。 运行结果如下: 序号学号姓名年级班级语文数学英语总分名次 01070101王博宇NaNNaN847193248NaN 12070102陈冠涛NaNNaN898989267NaN 23070103李文博NaNNaN897276237NaN 34070204姜海燕NaNNaN898989267NaN 45070205林若溪NaNNaN919583269NaN 21。2替换 既可以将对满足条件的行和列的数据替换,也可以对整个集合的数据按照条件进行替换。 df〔总分〕。replace(310,x,inplaceTrue) 将总分列的数值310替换为x。inplaceTrue表示改变原数据。 df。replace(76,0,inplaceTrue) 将整个DataFrame中的数值76替换为0。 df。replace(〔98,76,99〕,0,inplaceTrue) 将整个DataFrame中的数值98,76,99一次替换为0。 21。2排序 既可以将某一列作为关键字段排序,也可以将几个列分别作为主、次关键字段进行排序。排序既可以按升序排序,也可以按降序排序。 函数sortvalues()的语法格式如下: df。sortvalues(by〔col1,col2,。。。。。。,coln〕,ascendingFalse) 其中,coln表示列名,也可以是列名的列表;ascending表示排序方式,值为True表示升序,可以省缺,值为False表示降序。 如: dfdf。sortvalues(by〔总分〕,ascendingFalse) 表示按照总分从高到低排序。 dfdf。sortvalues(by〔总分,语文〕,ascendingFalse) 表示按照总分从高到低排序,若总分相同,再按照语文成绩从高到低排序。 21。3字段截取 函数slice()可以从某列中截取字符串。格式如下: slice(start,stop) 其中,start表示开始位置;stop表示结束位置 例: df〔年级〕df〔学号〕。str。slice(0,2) 通过此语句可以截取学号字段的第1、2个字符,并赋值给年级字段。 21。4记录抽取 可以抽取满足条件的记录。 例:抽取总分300的记录。 df〔df。总分300〕 抽取总分在300到310之间(包括300和310)的记录。 df〔df。总分。between(306,310)〕 抽取学号中包含0803的记录。这样可以非常方便的抽取某个班的信息。 df〔df。学号。str。contains(0803,naFalse)〕 此处的naFalse,含义是如遇到NaN这样的数据,直接做不匹配处理。 21。5修改记录 1、整列替换 我们在前面已经给整列填充过数据,填充时原来的数据就被覆盖了。 即如下语句: df〔总分〕df〔语文〕df〔数学〕df〔英语〕 2、个别修改 如将值‘99’替换为值‘100’,可用如下语句: df。replace(99,100) 将指定列的值替,如将语文列和英语列的值‘99’替换为值‘100’,可用如下语句: df。replace({语文:99,英语:99},100) 可用如下程序去验证: frompandasimportreadexcel filed:student。xlsx dfreadexcel(file,sheetname0,converters{学号:str}) print(df〔(df。语文99)(df。英语99)〕) dfdf。replace({语文:99,英语:99},100) print(df〔(df。语文99)(df。英语99)〕) 运行结果为: 序号学号姓名年级班级语文数学英语总分名次 2829090802丁能通09NaN11912099338NaN 2930090203沈丹妮09NaN10910899316NaN EmptyDataFrame Columns:〔序号,学号,姓名,年级,班级,语文,数学,英语,总分,名次〕 Index:〔〕 可以看出,第一个print()语句输出的结果中满足条件语文或英语为99分的有两条记录,替换语句执行以后,df中再没有满足条件语文或英语为99分的记录了。 21。6记录合并 函数concat()的格式如下: concat(〔dataFrame1,dataFrame2,。。。。。。〕,ignoreindexTrue) 其中,dataFrame1等表示要合并的DataFrame数据集合;ignoreindexTrue表示合并之后的重新建立索引。其返回值也是DataFrame类型。 concat()函数和append()函数的功能非常相似。 例: importpandas导入pandas模块 frompandasimportreadexcel导入readexecel filed:student。xlsx变量file表示文件路径,注意的用法数据见第18章表181 dfreadexcel(file,sheetname0,converters{学号:str}) 将Excel文件导入到DataFrame变量中 dfdf〔:5〕截取df的前5个记录 print(df)输出df df1df〔:3〕截取df的前3个记录存入df1中 df2df〔3:5〕截取df的最后2个记录存入df2中 df3pandas。concat(〔df2,df1〕)将df2与df1合并存入df3中 print(df3)输出df3 运行结果如下: 序号学号姓名年级班级语文数学英语总分名次 01070101王博宇NaNNaN847193NaNNaN 12070102陈冠涛NaNNaN898989NaNNaN 23070103李文博NaNNaN897276NaNNaN 34070204姜海燕NaNNaN898989NaNNaN 45070205林若溪NaNNaN919583NaNNaN 序号学号姓名年级班级语文数学英语总分名次 34070204姜海燕NaNNaN898989NaNNaN 45070205林若溪NaNNaN919583NaNNaN 01070101王博宇NaNNaN847193NaNNaN 12070102陈冠涛NaNNaN898989NaNNaN 23070103李文博NaNNaN897276NaNNaN 由于合并时是将df1合并到df2中,可以看出,索引仍然保持原来的状态。 21。7统计次数 可以用如下方法统计出某个值在某行或者某个范围出现的次数。 frompandasimportreadexcel filed:student。xlsx dfreadexcel(file,sheetname0,converters{学号:str}) dfdf〔:5〕 print(df) print(df〔语文〕。valuecounts()) 输出结果如下: 序号学号姓名年级班级语文数学英语总分名次 01070101王博宇NaNNaN847193NaNNaN 12070102陈冠涛NaNNaN898989NaNNaN 23070103李文博NaNNaN897276NaNNaN 34070204姜海燕NaNNaN898989NaNNaN 45070205林若溪NaNNaN919583NaNNaN 893 841 911 Name:语文,dtype:int64 可以看出,通过valuecounts()函数可以统计出列中各值出现的次数。 valuecounts()函数的参数还有: ascending,当ascendingTrue时升序排列,当ascendingFalse时升序排列(此时该参数可省缺); normalize,当normalizeTrue时,显示的不再是各值出现的次数,而是占比。 将上例中的语句print(df〔语文〕。valuecounts())改为: print(df〔语文〕。valuecounts(ascendingTrue,normalizeTrue)) 则输出结果变成了: 910。2 840。2 890。6 Name:语文,dtype:float64 21。8按值查找 print(df〔语文〕。isin(〔84,91〕)) 它的作用是查找‘语文’列中值和isin所指的列表中元素一致的记录,如果找到结果为True,否则为False。 输出结果: 0True 1False 2False 3False 4True Name:语文,dtype:bool 21。9数据分区 根据某个分区标准,将数据按照所属区域进行划分,并用相应的标签表示,可以用cut()方法来实现。 语法格式如下: cut(series,bins,rightTrue,labelsNULL) 其中: series表示需要分组的数据; bins表示分组的依据,是一个列表,其元素为划分分区的边界值,如〔0,72,96,120〕,就是划分3个分区,即072、7296、96120,默认的是左包右不包; right表示分组时右边是否闭合; labels表示分组的自定义标签,也可以不重新定义。 下面对上述学生成绩表中的语文成绩进行分组,并增加一个新的列语文等级。 importpandasaspd frompandasimportreadexcel导入readexecel filed:student。xlsx dfreadexcel(file,sheetname0,converters{学号:str}) df〔年级〕df〔学号〕。str。slice(0,2) df〔班级〕df〔学号〕。str。slice(0,4) df。总分df。语文df。数学df。英语 bins〔0,72,96,max(df。语文)1〕 lab〔不及格,及格,优秀〕 gradepd。cut(df。语文,bins,rightFalse,labelslab) df〔语文等级〕grade print(df。head()) print(语文成绩分等级统计结果:) print(df〔语文等级〕。valuecounts()) 运行结果如下: 序号学号姓名年级班级语文数学英语总分语文等级 01070101王博宇070701847193248及格 12070102陈冠涛070701898989267及格 23070103李文博070701897276237及格 34070204姜海燕070702898989267及格 45070205林若溪070702919583269及格 语文成绩分等级统计结果: 及格17 优秀10 不及格4 Name:语文等级,dtype:int64