Python与数据挖掘学习笔记(1)——Pandas模块

时间:2022-12-28 21:01:49

从图书馆借了一本有关于使用Python进行数据挖掘的书,是机械工业出版社出版的由张良均写的一本书,拿来作为入门,今天在学习使用Pandas模块时耗费了比较久的时间,记录一下今天的心得和体会。

书中有一道题目是基于给定的数据集,完成一系列操作:

1.判断第一列中(Id)是否有缺失值,如果有的话补充完整;

2.判断是否有重复记录,如果有,删除至唯一。

3.计算成绩的平均值,作为新的一列加入到原始数据框中。

4.寻找平均分最高的记录。

5.统计每个科目及格的人数。

所给的数据集如下所示,是一个csv格式的表格。在此我使用的是python3.6进行编程,和书中使用的2.7版本有一些区别。

Python与数据挖掘学习笔记(1)——Pandas模块

作为一个菜鸟,安装模块也耗费了我不少时间,后来发现使用PyCharm自带的安装工具是很方便的,在Setting里面的Project Interpretor即可找到相对应的模块进行安装,一定注意安装的是Pandas模块而不是Panda。

Pandas模块中两个很重要的数据结构即为DataFrame和Series,可以简单的理解为一个多列的表格和一个单列的表格。一些基本的操作网上相关的教程很多,在此不再赘述。

Pandas模块的官方文档:http://pandas.pydata.org/pandas-docs/stable/index.html

里面的方法很多,看了一天我也只是看了个大概,在此简单介绍一下我的代码里用到的一些吧,首先先上代码。

import pandas as pd
from collections import Iterable
import numpy

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='')
while True:
    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,如果有重复的则不能得到,因此需要将求得的最大值的哪一个条目删除以后继续求最大值,直到求得的最大值发生改变。