【问题描述】根据csv文件中记录的各科成绩,统计大学英语成绩在80-90分之间的学生人数。
【输入形式】csv文件
【输出形式】txt文件
【样例输入】
【样例说明】
【评分标准】
题意主要是判断英语成绩是否在range(80,90)这个范围,对Dataframe二维数组切片判断统计即可
import pandas as pd
if __name__ == '__main__':
open('summary.txt','w').write(str(len([x for x in pd.read_csv('scores.csv')['大学英语'] if x in range(80,91)]))) #无关闭IO流,不建议
上面代码并没有关闭文件IO流,不建议,当然可以用上下文管理器,应该也可以使用pandas 的写入操作
import pandas as pd
if __name__ == '__main__':
[x.write(str(len([x for x in pd.read_csv('scores.csv')['大学英语'] if x in range(80,91)]))) and x.close() for x in [open('summary.txt','w')]] #可以关闭文件流
上面可以关闭文件流,尝试用.closed来判断
print(f.closed)
而pandas判断范围是使用df.between(left,right,inclusive=[True,False])即可判断指定的范围(注意,是输出一个只有True和False的数组),默认inclusive=True为左右开区间,False为左右闭区间,一下我并没有使用between,可以这样:print(data[‘大学英语’].between(80,90).sum()),因为sum()函数默认会统计非假的元素的个数,比如print(sum([True,True,False]))为2,故而这就输出个数了,具体如下,没有粘贴代码,因为不确定线上测试是否正确:
忽然发现还是可以用pandas的写入函数来解决,只要熟悉并用好参数(to_csv(‘summary.txt’,header=None,index=None,sep=’ ',mode=‘w’))就能写入一个字符串啦,代码如下:
import pandas as pd
if __name__ == '__main__':
pd.Series([pd.read_csv('scores.csv')['大学英语'].between(80,90).sum()]).to_csv('summary.txt',header=None,index=None,sep=' ',mode='w')
在写入csv文件时出现再读取增加多一无名列的问题:
原来写入时是这样:
再读取:
我所想到的解决方案就是读取时改变读取起始,使用index_col=0参数:
print(pd.read_csv('scores.csv',index_col=0)) #解决读取行索引出问题的情况
当然,以上还是没有解决源文件的问题