zoukankan      html  css  js  c++  java
  • 3-Pandas数据初探索之缺失值处理与丢弃数据(填充fillna()、删除drop()、drop_duplicates()、dropna())

     一、了解缺失值

    • 通常使用 NA('not available')来代指缺失值
    • Pandas的数据结构中,缺失值使用 NaN('Not a Number')进行标识

    除了汇总统计方法,还可以使用isnull()来对数据中缺失的样本占比、特征大致的缺失情况进行了解。

    >>> df =pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),
    ...                   'two':pd.Series([1,3,2,7],index=['a','b','c','d']),
    ...                   'three':pd.Series([3,8,3],index=['d','a','c'])})
    >>> df
       one  two  three
    a  1.0    1    8.0
    b  2.0    3    NaN
    c  3.0    2    3.0
    d  NaN    7    3.0
    
    #缺失值的数量分析
    >>> df.isnull()
         one    two  three
    a  False  False  False
    b  False  False   True
    c  False  False  False
    d   True  False  False
    
    >>> df.isnull().sum()
    one      1
    two      0
    three    1
    dtype: int64

    二、缺失值填充---fillna()

       使用fillna()方法进行缺失值填补

    填充方式分为以下几种:

    (1)使用同一个值填补所有的缺失值

    >>> df.fillna('用我填充')
        one  two three
    a     1    1     8
    b     2    3  用我填充
    c     3    2     3
    d  用我填充    7     3
    

    (2)向前填充、向后填充--->通过设置参数method参数来实现

    method参数 说明
    ffill或pad 向前填充值
    bfill或backfill 向后填充值
    #向前填充
    >>> df.fillna(method='pad')
       one  two  three
    a  1.0    1    8.0
    b  2.0    3    8.0
    c  3.0    2    3.0
    d  3.0    7    3.0
    
    #向后填充
    >>> df.fillna(method='bfill')
       one  two  three
    a  1.0    1    8.0
    b  2.0    3    3.0
    c  3.0    2    3.0
    d  NaN    7    3.0

    (3)对不同列的缺失值使用不同的值进行填补

      可以使用字典的方式,如下:

    >>> df.fillna({'one':1,'three':3})
       one  two  three
    a  1.0    1    8.0
    b  2.0    3    3.0
    c  3.0    2    3.0
    d  1.0    7    3

    (4)使用一个Pandas的自动对齐功能进行填补

       这也是最常使用的一种方式

    >>> df.fillna(df.mean())
       one  two     three
    a  1.0    1  8.000000
    b  2.0    3  4.666667
    c  3.0    2  3.000000
    d  2.0    7  3.000000

    三、丢弃数据

      在一些实际的应用场景中,需要根据某些过滤条件丢弃部分无用数据,在多数情况下数据过滤可以同时达到获取和丢弃数据的目的

      除了使用布尔表达式之外,Pandas对象还有以下三种方法来丢弃无用数据:

    1. drop():根据标签丢弃数据
    2. drop_duplicates():丢弃重复数据
    3. dropna():丢失缺失数据

    (1)根据标签丢弃数据----drop()

      drop()可以根据标签丢弃多行或多了数据,基本参数如下:

        labels:单个或者多个标签,传入类列表值(列表、array等)

        axis:丢弃行(0,默认)或者列(1)

        inplace:是否用结果替换原pandas对象(默认False)

    #仍然以上述的df为例
    >>> df
       one  two  three
    a  1.0    1    8.0
    b  2.0    3    NaN
    c  3.0    2    3.0
    d  NaN    7    3.0
    
    >>> df.drop(['d','c'])
       one  two  three
    a  1.0    1    8.0
    b  2.0    3    NaN
    
    >>> df.drop(labels=['d','c'])
       one  two  three
    a  1.0    1    8.0
    b  2.0    3    NaN
    
    >>> df.drop(labels=['three'],axis=1)
       one  two
    a  1.0    1
    b  2.0    3
    c  3.0    2
    d  NaN    7

     (2)丢弃重复数据----drop_duplicates()

      1)由于不同的原因,数据中可能会包含重复出现的行(记录),重复的记录会造成信息的冗余,但是在实际中丢弃重复数据需要谨慎,盲目去重可以会造成数据集丢失部分数据。

      duplicated()方法可以返回一个布尔型的Series,表示各行是否重复,仅仅将重复的最后一行标记为True;

      注:duplicated()方法有参数keep,keep的值有一下三种情况:

        keep = 'first'---->返回结果中的第一个重复的数据

        keep = 'last'----->返回结果中的最后一个重复的数据

        keep = False------>所有的重复数据为True

    #先创建一个new_df,与df中有重复的记录
    >>> new =pd.DataFrame({'one':pd.Series([1,3],index=['e','f']),'two':pd.Series([1,2],index=['e','f']),'three':pd.Series([8,3],index=['e','f'])})
    >>> new
       one  two  three
    e    1    1      8
    f    3    2      3
    >>> new_df = pd.concat([df,new])
    >>> new_df
       one  two  three
    a  1.0    1    8.0
    b  2.0    3    NaN
    c  3.0    2    3.0
    d  NaN    7    3.0
    e  1.0    1    8.0
    f  3.0    2    3.0
    
    #查看各行是否重复
    >>> new_df.duplicated()
    a    False
    b    False
    c    False
    d    False
    e     True
    f     True
    dtype: bool
    
    #通过布尔过滤可以丢弃重复数据
    >>> new_df[new_df.duplicated()==False]
       one  two  three
    a  1.0    1    8.0
    b  2.0    3    NaN
    c  3.0    2    3.0
    d  NaN    7    3.0
    
    >>> new_df.duplicated(keep='first')
    a    False
    b    False
    c    False
    d    False
    e     True
    f     True
    dtype: bool
    >>> new_df.duplicated(keep=False)
    a     True
    b    False
    c     True
    d    False
    e     True
    f     True
    dtype: bool

      2)Pandas提供的drop_duplicates()可以更加简便的完成去重操作,默认情况下会判断全部列,若只希望根据某一列判断重复项,则在括号后加入列即可。

    >>> new_df.drop_duplicates()
       one  two  three
    a  1.0    1    8.0
    b  2.0    3    NaN
    c  3.0    2    3.0
    d  NaN    7    3.0
    
    >>> new_df.drop_duplicates('three')
       one  two  three
    a  1.0    1    8.0
    b  2.0    3    NaN
    c  3.0    2    3.0
    >>> new_df.drop_duplicates(['one','three'])
       one  two  three
    a  1.0    1    8.0
    b  2.0    3    NaN
    c  3.0    2    3.0
    d  NaN    7    3.0
    

      (3)丢弃缺失值数据----dropna()

      在含有缺失值样本比例较小的情况下,可以考虑丢弃缺失值所在的行,或者说一个特征大部分都是缺失值是,也可以考虑丢弃该特征。

      dropna()方法用于丢弃缺失值相关数据,其常用的参数如下:

        axis:丢弃缺失值所在的行(0,默认)或所在列(1);

        how:'any'表示只要存在缺失值就丢弃(默认),'all'表示所有的值均为缺失值才丢弃;

        subset:考虑部分行和列

        inplace:是否替换原来的Pandas对象

    #仍以df为例,此时若要删除存在缺失值所在的行,则
    >>> df.dropna(how='any')
       one  two  three
    a  1.0    1    8.0
    c  3.0    2    3.0
    
    #若删除three列,则
    >>> df.drop(columns='three',inplace=True)
    >>> df
       one  two
    a  1.0    1
    b  2.0    3
    c  3.0    2
    d  NaN    7
    

     

  • 相关阅读:
    VC++以及VS个版本比较 及 C++编译器比较
    这本书的封面
    json_encode(),json_deocde()用法说明
    循环匹配,一般用于多选列表选中状态
    js判断变量是否被定义
    js onload()事件调用方法
    js push使用方法
    iframe去掉边滚动条
    ajax上传文件(使用ajaxfileupload)
    基于url的权限控制
  • 原文地址:https://www.cnblogs.com/Cheryol/p/13382560.html
Copyright © 2011-2022 走看看