我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

面对存在缺失值的数据,有两种选择。一个是给它填充上合理的数据,另外一个就是删除掉相关的数据。本文说的是第二种情况,删除掉数据集的缺失值相关数据,这里说的是“相关数据”,那么意思就是会有正常的数据被主动误伤。

苏南大叔:python数据清洗,如何使用df.dropna()删除缺失值相关数据? - dropna删除缺失数据
python数据清洗,如何使用df.dropna()删除缺失值相关数据?(图2-1)

大家好,这里是苏南大叔的“奥林匹克技术竞赛”博客,这里讲述苏南大叔和计算机代码之间的故事。测试环境:python@3.6.8pandas@1.1.5numpy@1.24.4

函数原型

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
  • axis,表示删除行还是列。默认值为0,表示删除包含缺失值的行;设置为1表示删除包含缺失值的列。
  • how,表示删除的条件。默认值为’any’,表示只要存在一个缺失值就删除整行或整列;设置为’all’表示只有当整行或整列都是缺失值时才删除。
  • thresh,表示在删除之前需要满足的非缺失值的最小数量。如果行或列中的非缺失值数量小于等于thresh,则会被删除。
  • subset,用于指定要检查缺失值的特定列名或行索引。
  • inplace,表示是否对原始数据进行就地修改。默认值为False,表示不修改原始数据,而是返回一个新的数据框。
注意:默认情况下,不修改原df,而是返回一个新的df!所以,需要用一个新的变量去承载一下。

测试用例

import numpy as np
import pandas as pd
from numpy import nan as NaN
df = pd.DataFrame({
    'name' : ['虎子','老许','二赖子','老白','小黑'],
    'age'  : [5,NaN,None,8,10],
    'class': ["dog", NaN, "fish", NaN, "puppy"],
    'nan': [NaN,NaN,NaN,NaN,"None"]
})
print(df)

输出:

  name   age  class   nan
0   虎子   5.0    dog   NaN
1   老许   NaN    NaN   NaN
2  二赖子   NaN   fish   NaN
3   老白   8.0    NaN   NaN
4   小黑  10.0  puppy  None

值得特别说明的是:none经过dataframe的处理,也变成了NaN。没转换的那个none,是个字符串。

苏南大叔:python数据清洗,如何使用df.dropna()删除缺失值相关数据? - dropna输出
python数据清洗,如何使用df.dropna()删除缺失值相关数据?(图2-2)

不传递参数,默认

一个参数也不传递的话,就是最常见的用法。

df.dropna()

输出:

  name   age  class   nan
4   小黑  10.0  puppy  None

效果就是:删除掉所有和NaN或者None相关的数据行(一条数据记录),注意不是列。如果对应到数据库里面的话,就很好理解了。把所有有瑕疵的数据全部删掉,以行(一条数据)为单位。

axis删除行或列

axis默认必然是0,删除的必须是行,这个很好理解。如果改成1,效果是:某个特征中含有Na数据的话,就删除整个特征。个人觉得不是很合理。

df.dropna(axis=1)

输出:

  name
0   虎子
1   老许
2  二赖子
3   老白
4   小黑

只有name列是全员没有缺失值的。

how删除的标准

how默认是any,意思是有na数据就删除。改成all的话,意思是整行或者整列(被axis控制)的数据,全部有问题的时候,全部删除。

个人认为,how='all'应该和axis=1合用。因为:

  • 一条记录里面,有na数据,删除合理。默认:axis=0,how='any'
  • 一列数据里面,全部为na数据,删除才合理。axis=1,how='all'
df["nan"][4] = None
df2 = df.dropna(axis=1, how='all')

输出:

  name   age  class
0   虎子   5.0    dog
1   老许   NaN    NaN
2  二赖子   NaN   fish
3   老白   8.0    NaN
4   小黑  10.0  puppy

只有全为Nahow='all')的最后一列数据(axis=1)被删除。

thresh非缺失值的最大数(不包含)

dropna()thresh参数,和fillna()limit参数,很相似。意思是:对应行或者列(axis控制)里面的【非缺失值】数据,【小于】thresh数的时候,才能被删除。

某种意义上来说,和how参数的管辖范围有重合。
df["nan"][4] = None
df.dropna(thresh=2)

一行数据中,非缺失值数量小于2的情况。输出:

  name   age  class   nan
0   虎子   5.0    dog   NaN
2  二赖子   NaN   fish   NaN
3   老白   8.0    NaN   NaN
4   小黑  10.0  puppy  None
df.dropna(thresh=4, axis=1)

一列数据中,非缺失值数量小于4的情况。输出:

  name
0   虎子
1   老许
2  二赖子
3   老白
4   小黑

subset检测缺失值的行或列

类型是集合,默认查找na值的范围是全部,这里指出仅仅检测其中的某几行某几列,所以变量类型是个集合。

df.dropna(subset=['age'])

age列中有缺失值的行被删除。
输出:

  name   age  class   nan
0   虎子   5.0    dog   NaN
3   老白   8.0    NaN   NaN
4   小黑  10.0  puppy  None
df.dropna( axis=1, subset=[0,1])

1,2行数据中,有缺失值的列,被删除【典型的株连九族类型】。输出:

  name
0   虎子
1   老许
2  二赖子
3   老白
4   小黑

相关文章

结语

更多python经验文章,请参考:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python