• 【学习】数据处理基础知识(缺失值处理)【pandas】


    缺失数据(missing data)大部分数据分析应用中非常常见。pd设计目标之一就是让缺失数据的处理任务尽量轻松。

    pd 使用浮点值NaN(Not a Number) 表示浮点和非浮点数组中的缺失数据。是一个被检测出来的标识

    import pandas as pd
    import numpy as np
    string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
    string_data
    string_data.isnull()
    
    #内置的None值也会被当作Na处理
    string_data[0] = None
    string_data.isnull()

    Out[180]:
    0     True
    1    False
    2     True
    3    False
    dtype: bool

    Na处理方法

    """
    =====Na处理方法=========
    dropna  根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阀值调节对缺失值的容忍度
    fillna  用指定值或插值方法填充缺失数据
    isnull  返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值,该对象的类型与源类型一样
    notnull  isnull的否定式
    """

    1、 滤除缺失数据

    #dropna 返回一个仅含非空数据和索引值的Series
    
    from numpy import nan as NA
    data = pd.Series([1, NA, 3.5, NA, 7])
    data.dropna()

    Out[183]:
    0    1.0
    2    3.5
    4    7.0
    dtype: float64

    #也可以通过布尔型索引达到这个目标
    data[data.notnull()]
    #对于dataFrame,dropna默认丢弃任何含有缺失值的行
    data = pd.DataFrame([[1., 6.5, 3], [1., NA, NA], [NA, NA, NA], [NA, 6.5, 3]])
    cleaned = data.dropna()
    data
    Out[187]:
         0    1    2
    0  1.0  6.5  3.0
    1  1.0  NaN  NaN
    2  NaN  NaN  NaN
    3  NaN  6.5  3.0
    cleaned
    Out[188]:
         0    1    2
    0  1.0  6.5  3.0
    data.dropna(how = 'all')
    Out[189]: 0 1 2 0 1.0 6.5 3.0 1 1.0 NaN NaN 3 NaN 6.5 3.0

    只用这种方式丢弃列,只需传入axis =1 即可

    #只用这种方式丢弃列,只需传入axis =1 即可
    data[4] = NA
    data
    data.dropna(axis = 1, how = 'all')

    另一个滤除DF的行问题涉及时间序列数据,假设你只想留下一部分预测数据,可以用thresh参数实现些目的

    df = pd.DataFrame(np.random.randn(7, 3))
    df
    df.ix[:4, 1] = NA; df.ix[:2, 2] = NA
    Out[195]:
              0         1         2
    0 -1.391379       NaN       NaN
    1  0.283693       NaN       NaN
    2 -1.256739       NaN       NaN
    3 -0.279809       NaN  0.511898
    4 -2.942845       NaN -0.938693
    5  1.478454 -1.869872 -1.815566
    6 -1.001717 -0.074136 -1.132250
    df.dropna(thresh
    = 3)
    Out[196]:
              0         1         2
    5  1.478454 -1.869872 -1.815566
    6 -1.001717 -0.074136 -1.132250

    2、 填充缺失 数据

    fillna方法是最主要的函数,通过一个常数调用fillna就会将缺失值替换为那个常数值



    df.fillna(0) Out[
    197]: 0 1 2 0 -1.391379 0.000000 0.000000 1 0.283693 0.000000 0.000000 2 -1.256739 0.000000 0.000000 3 -0.279809 0.000000 0.511898 4 -2.942845 0.000000 -0.938693 5 1.478454 -1.869872 -1.815566 6 -1.001717 -0.074136 -1.132250
    #若是通过一个字典调用fillna, 就可以实现对不同的列填充不同的值
    df.fillna({1: 0.5, 3: -1})
    Out[198]: 
              0         1         2
    0 -1.391379  0.500000       NaN
    1  0.283693  0.500000       NaN
    2 -1.256739  0.500000       NaN
    3 -0.279809  0.500000  0.511898
    4 -2.942845  0.500000 -0.938693
    5  1.478454 -1.869872 -1.815566
    6 -1.001717 -0.074136 -1.132250
    #fillna默认会返回新对象,但也可以对现有对象进行就地修改
    #总是返回被填充对象的引用
    _ = df.fillna(0, inplace = True) df
    Out[200]: 
              0         1         2
    0 -1.391379  0.000000  0.000000
    1  0.283693  0.000000  0.000000
    2 -1.256739  0.000000  0.000000
    3 -0.279809  0.000000  0.511898
    4 -2.942845  0.000000 -0.938693
    5  1.478454 -1.869872 -1.815566
    6 -1.001717 -0.074136 -1.132250

    对reindex有效的那些插值方法也可用于fillna

    df = pd.DataFrame(np.random.randn(6, 3))
    df.ix[2:, 1] = NA; df.ix[4:, 2] = NA
    df

    Out[204]:
              0         1         2
    0  1.498980 -0.048566  1.406554
    1  1.143778 -0.370818  1.333525
    2 -2.557671       NaN  0.419188
    3 -0.648393       NaN -0.159103
    4  0.794345       NaN       NaN
    5  1.814522       NaN       NaN
    #ffill 向前填充值
    #bfill 向后填充值
    df.fillna(method = 'ffill')

    Out[205]:
              0         1         2
    0  1.498980 -0.048566  1.406554
    1  1.143778 -0.370818  1.333525
    2 -2.557671 -0.370818  0.419188
    3 -0.648393 -0.370818 -0.159103
    4  0.794345 -0.370818 -0.159103
    5  1.814522 -0.370818 -0.159103
    #可填充最大标识量为2 df.fillna(method = 'ffill', limit =2)

    Out[206]:
              0         1         2
    0  1.498980 -0.048566  1.406554
    1  1.143778 -0.370818  1.333525
    2 -2.557671 -0.370818  0.419188
    3 -0.648393 -0.370818 -0.159103
    4  0.794345       NaN -0.159103
    5  1.814522       NaN -0.159103
    #均值或中位数填充
    data = pd.Series([1., NA, 3.5, NA, 7])
    data
    data.fillna(data.mean())

    Out[215]:
    0    1.000000
    1    3.833333
    2    3.500000
    3    3.833333
    4    7.000000
    dtype: float64
    """
    =====fillna函数的参数======
    value  用于填充缺失值的标量值或字典对象
    method 插值方式,如果函数调用时未指定其他参数的话,默认为ffill
    axis   待填充的轴,默认axis = 0
    inplace  修改调用者对象而不产生副本,True为就地修改
    limit   (对于前向和后台填充)可以连续填充的最大数量
    """
  • 相关阅读:
    [tarjan][树上差分] Codeforces 555E Case of Computer Network
    [线段树] Jzoj P1214 项链工厂
    [矩阵乘法] Jzoj P2288 沼泽鳄鱼
    [状压dp][dfs] Jzoj P2679 跨时代
    [spfa][差分约束] Bzoj 2330 糖果
    [spfa] Bzoj 2118 墨墨的等式
    [倍增][Floyd] Bzoj 2165 大楼
    [虚树][树形dp] Bzoj P3611 大工程
    [虚树][树形dp] Bzoj P2286 消耗战
    [数位dp] Jzoj P3316 非回文数字
  • 原文地址:https://www.cnblogs.com/yizhenfeng/p/7490854.html
Copyright © 2020-2023  润新知