从图书馆借了一本有关于使用Python进行数据挖掘的书,是机械工业出版社出版的由张良均写的一本书,拿来作为入门,今天在学习使用Pandas模块时耗费了比较久的时间,记录一下今天的心得和体会。
书中有一道题目是基于给定的数据集,完成一系列操作:
1.判断第一列中(Id)是否有缺失值,如果有的话补充完整;
2.判断是否有重复记录,如果有,删除至唯一。
3.计算成绩的平均值,作为新的一列加入到原始数据框中。
4.寻找平均分最高的记录。
5.统计每个科目及格的人数。
所给的数据集如下所示,是一个csv格式的表格。在此我使用的是python3.6进行编程,和书中使用的2.7版本有一些区别。
作为一个菜鸟,安装模块也耗费了我不少时间,后来发现使用PyCharm自带的安装工具是很方便的,在Setting里面的Project Interpretor即可找到相对应的模块进行安装,一定注意安装的是Pandas模块而不是Panda。
Pandas模块中两个很重要的数据结构即为DataFrame和Series,可以简单的理解为一个多列的表格和一个单列的表格。一些基本的操作网上相关的教程很多,在此不再赘述。
里面的方法很多,看了一天我也只是看了个大概,在此简单介绍一下我的代码里用到的一些吧,首先先上代码。
importpandas as pdfrom collections importIterableimportnumpy
pd.options.display.precision= 2 #设置小数点精度
data1 = pd.read_csv('F:\PythonTest\Mytestdata\data.csv')#print(data1)
data1['Id'] = data1['Id'].interpolate() #判断第一列是否有缺失值
data1 = data1.drop_duplicates(subset=('English','Chinese','Math'))#去掉重复条目
data1= data1.fillna(0) #成绩没有的视为0分
data1['Chinese'] = data1['Chinese'].astype('int64') #成绩换为整形变量
data1['Id'] = list(range(1,data1['Id'].size+1))
data1= data1.set_index('Id') #用ID作为index
average = data1.mean(axis=1)
average.name= 'Average' #给Average一个name属性,否则不能使用join
data1 = data1.join(average) #平均值作为一个column添加进DataFrames中
print(data1)print('The best grade is: {0:.2f} and the id is:'.format(average.values.max()),end='')whileTrue:
average_max=average.values.max()print(average.idxmax(), end=' ')
average= average.drop(index = average.index[average.values.argmax()])#删除已找到的最大值 寻找是否有重复值
if not average_max ==average.values.max():print('\n')break
print('There is {0} students who has passed the Chinese exam.'.format(data1['Chinese'].where(data1['Chinese']>=60).count()))print('There is {0} students who has passed the Math exam.'.format(data1['Math'].where(data1['Math']>=60).count()))print('There is {0} students who has passed the English exam.'.format(data1['English'].where(data1['English']>=60).count()))
首先一个是options这个选项,他定义了一些在程序使用过程中的设置,在此为了美观,我将显示的精度设置为了小数点后两位,值得注意的一点是直接在print中调用format进行格式化会提示报错,因为数据结构为DataFrame,不支持直接进行format。
read_csv:读取数据集
interpolate:可以用来判断DataFrame或者Series中有没有空缺值并进行补充,同时也可以进行设置补充的值是多少,在这里默认的是按照线性顺序进行补充
drop_duplicates:去掉重复的条目,注意选择其中的subset时把三个科目的成绩全部包含在一个tuple里。
fillna:把其中缺失的成绩补充为0
astype:因为其中语文的成绩为float,把他变成一个整形变量
set_index:将其中的Id作为index
mean:求平均值
join:将一个DataFrame或者Series添加到现有的数据结构中
count:求得一个数据结构中为非空数值的个数
where:可以理解为将布满足条件的数值屏蔽,在该题目中,条件为及格,即大于等于60分,使用了where以后,会得到一个copy,在这个copy中,不满足条件的values都被替换成为NaN,因此可以搭配count得到及格的人数
然后还有一个需要注意的地方就是在寻找平均数最大值的时候,使用argmax仅仅能得到第一个最大值的index,如果有重复的则不能得到,因此需要将求得的最大值的哪一个条目删除以后继续求最大值,直到求得的最大值发生改变。