Python数据分析:缺失值检测与处理

举报
Python新视野 发表于 2021/11/30 15:01:07 2021/11/30
【摘要】 在实际的数据处理中,缺失值是普遍存在的,如何使用 Python 检测和处理缺失值,就是本文要讲的主要内容。 检测缺失值我们先创建一个带有缺失值的数据框(DataFrame)。import pandas as pddf = pd.DataFrame( {'A': [None, 2, None, 4], 'B': [10, None, None, 40], 'C': [1...

在实际的数据处理中,缺失值是普遍存在的,如何使用 Python 检测和处理缺失值,就是本文要讲的主要内容。

检测缺失值

我们先创建一个带有缺失值的数据框(DataFrame)。

import pandas as pd

df = pd.DataFrame(
    {'A': [None, 2, None, 4],
     'B': [10, None, None, 40], 
     'C': [100, 200, None, 400],
     'D': [None, 2000, 3000, None]})
df

数值类缺失值在 Pandas 中被显示为 NaN (Not A Number)。下面看看如何判断哪些列或者哪些行有缺失值。

1.info()

info() 返回的结果中,我们只需要观察每一列对应的 Non-Null Count 的数量是否等于 RangeIndex(索引范围) 即可。

2.isnull()

isnull() 返回一个与原 DataFrame 大小(列数,行数)相同的数据框,行列对应的数据代表着该位置是否为缺失值。

df.isnull()


使用 sum() 来检测每列中的缺失值的数量。

df.isnull().sum()


通过 .TDataFrame 转置,获取检测每行中缺失值的数量。

df.isnull().T.sum()

缺失值处理

删除缺失值

如果出现缺失值的行/列重要性不大的话,可以直接使用 dropna() 删除带有缺失值的行/列。

df.dropna(axis=0,
          how='any',
          thresh=None,
          subset=None,
          inplace=False)

参数含义

  • axis:控制行列的参数,0 行,1 列。
  • how:any,如果有 NaN,删除该行或列;all,如果所有值都是 NaN,删除该行或列。
  • thresh:指定 NaN 的数量,当 NaN 数量达到才删除。
  • subset:要考虑的数据范围,如:删除缺失行,就用subset指定参考的列,默认是所有列。
  • inplace:是否修改原数据,True直接修改原数据,返回 None,False则返回处理后的数据框。

指定 axis = 1,如果列中有缺失值,则删除该列。

df.dropna(axis=1, how='any')
由于每列都有缺失值,所以只剩索引。

指定 axis = 0(默认),如果行中有缺失值,则删除该行。

df.dropna(axis=0, how='any')

以 ABC 列为参照,删除这三列都是缺失值的行。

df.dropna(axis=0, subset=['A', 'B', 'C'], how='all')

保留至少有3个非NaN值的行。

df.dropna(axis=0, thresh=3)

填补缺失值

另一种常见的缺失值处理方式就是使用 fillna() 填补缺失值。

df.fillna(value=None,
          method=None,
          axis=0,
          inplace=False,
          limit=None)

1. 直接指定填充值

df.fillna(666)


2.用缺失值前/后的值填充

按前一个值填充

method 值为 ffillpad时,按前一个值进行填充。

axis = 0,用缺失值同一列的上一个值填充,如果缺失值在第一行则不填充。

axis = 1,用缺失值同一行的上一个值填充,如果缺失值在第一列则不填充。

df.fillna(axis=0, method='pad')


按后一个值填充

method 值为 backfillbfill时,按后一个值进行填充。

axis = 0,用缺失值同一列的下一个值填充,如果缺失值在最后一行则不填充。

axis = 1,用缺失值同一行的下一个值填充,如果缺失值在最后一列则不填充。

df.fillna(axis=0, method='bfill')

指定相应的方法来填充

df.fillna(df.mean())

limit限制填充次数

在ABCD列上,每列只填充第一个空值。

df.fillna(value=666, axis=1, limit=1)



这就是今天要分享的内容,微信搜 Python新视野,每天带你了解更多有用的知识。更有整理的近千套简历模板,几百册电子书等你来领取哦!

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。