zoukankan      html  css  js  c++  java
  • Python与数据挖掘学习笔记(1)——Pandas模块

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

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

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

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

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

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

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

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

    作为一个菜鸟,安装模块也耗费了我不少时间,后来发现使用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:PythonTestMytestdatadata.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('
    ')
            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,如果有重复的则不能得到,因此需要将求得的最大值的哪一个条目删除以后继续求最大值,直到求得的最大值发生改变。

  • 相关阅读:
    apache的httpclient进行http的交互处理
    Java 基础篇之反射
    死磕 java线程系列之创建线程的8种方式
    Spring Boot(三) 使用Lombok
    Spring Boot (七): Mybatis极简配置
    Spring Boot Thymeleaf 实现国际化
    微项目:一步一步带你使用SpringBoot入门(二)
    SSM框架手动实现分页逻辑(非PageHelper)
    Java 基础篇之集合
    一起来学Java注解(Annotation)
  • 原文地址:https://www.cnblogs.com/fengf1/p/7846609.html
Copyright © 2011-2022 走看看