• Pandas (三)缺失值处理


    在了解缺失值如何处理之前,首先要知道的就是什么是缺失值?直观上理解,缺失值表示的是“缺失的数据”。

    可以思考一个问题:是什么原因造成的缺失值呢?其实有很多原因,实际生活中可能由于有的数据不全所以导致数据缺失,也有可能由于误操作导致数据缺失,又或者人为地造成数据缺失。

    一、寻找缺失值

     这些缺失值,可以使用 isnull() 或 notnull()方法来操作。

    grade.isnull()
    grade.notnull()

    掩码提取空值

    # 把grade里面 语文为空的数据提取出来
    grade[grade.语文.isnull()]
    # 三科有空的同学 提取出来
    grade[grade.语文.isnull() | grade.数学.isnull() | grade.英语.isnull() ]
    # 统计空值
    grade.info()

    二、丢弃缺失值

     既然有缺失值了,常见的一种处理办法就是丢弃缺失值。使用 dropna 方法可以丢弃缺失值。

    # 只要存在空值的行,全部删除
    grade.dropna()
    # 只要列中存在空值 ,则删除
    grade.dropna(axis=1).shape
    # subset 子集
    # 只删除姓名为空的数据
    grade.dropna(subset=['姓名'])
    user_info.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

    Seriese 使用 dropna 比较简单,对于 DataFrame 来说,可以设置更多的参数。

    axis 参数用于控制行或列,跟其他不一样的是,axis=0 (默认)表示操作行,axis=1 表示操作列。

    how 参数可选的值为 any(默认) 或者 all。any 表示一行/列有任意元素为空时即丢弃,all 一行/列所有值都为空时才丢弃。

    subset 参数表示删除时只考虑的索引或列名。

    thresh参数的类型为整数,它的作用是,比如 thresh=3,会在一行/列中至少有 3 个非空值时将其保留。

    # 把一部分设置为空
    grade_2.loc[30: , '总分'] = np.nan
    grade_2.loc[50: , '班名次'] = np.nan
    grade_2

    三、填充缺失值

    除了可以丢弃缺失值外,也可以填充缺失值,最常见的是使用 fillna 完成填充。fillna 这名字一看就是用来填充缺失值的。

    1.固定值填充

    填充缺失值时,常见的一种方式是使用一个标量来填充。例如,这里我样有缺失的年龄都填充为 0。

    # 对DataFrame填充
    grade.fillna(0)
    # 采用平均数填充语文
    grade.语文.fillna( round(grade.语文.mean()))

    采用固定值填充, 均值 , 中位数, 众数……

    2.上下文填充

    除了可以使用标量来填充之外,还可以使用前一个或后一个有效值来填充。设置参数 method='pad' 或 method='ffill' 可以使用前一个有效值来填充。

    # 采用上面的进行填充
    grade.fillna(method='ffill')

    设置参数 method='bfill' 或 method='backfill' 可以使用后一个有效值来填充。

    # 采用下面的进行填充
    grade.fillna(method='bfill')

    除了通过 fillna 方法来填充缺失值外,还可以通过 interpolate 方法来填充。默认情况下使用线性差值,可以是设置 method 参数来改变方式。

    # 线性插值填充
    grade.interpolate()

    3.替换缺失值

     大家有没有想过一个问题:到底什么才是缺失值呢?你可能会奇怪说,前面不是已经说过了么,None、np.nan、NaT 这些都是缺失值。

    但是我也说过了,这些在 Pandas 的眼中是缺失值,有时候在我们人类的眼中,某些异常值我们也会当做缺失值来处理。 例如,在我们的存储的用户信息中,假定我们限定用户都是青年,出现了年龄为 40 的,我们就可以认为这是一个异常值。再比如,我们都知道性别分为男性(male)和女性(female),在记录用户性别的时候,对于未知的用户性别都记为了 “unknown”,很明显,我们也可以认为“unknown”是缺失值。此外,有的时候会出现空白字符串,这些也可以认为是缺失值。

    对于上面的这种情况,我们可以使用 replace 方法来替换缺失值。

    4.使用其他对象填充

    除了我们自己手动丢弃、填充已经替换缺失值之外,我们还可以使用其他对象来填充。

    例如有两个关于用户年龄的 Series,其中一个有缺失值,另一个没有,我们可以将没有的缺失值的 Series 中的元素传给有缺失值的。

    user_info['新年龄'] = user_info.年龄.copy()
    user_info['新年龄'].fillna(20, inplace=True)
    user_info
  • 相关阅读:
    NOIP 2012 T5 借教室 [洛谷P1083]
    POJ2437 Muddy roads
    POJ2288 Islands and Bridges
    洛谷P2014 TYVJ1051 选课
    POJ1741 Tree
    CODEVS1995 || TYVJ1863 黑魔法师之门
    TYVJ1939 玉蟾宫
    TYVJ1305 最大子序和
    POJ1737 Connected Graph
    TYVJ1864 守卫者的挑战
  • 原文地址:https://www.cnblogs.com/BC10/p/11691639.html
Copyright © 2020-2023  润新知