python数据清洗,如何使用df.dropna()删除缺失值相关数据?
发布于 作者:苏南大叔 来源:程序如此灵动~
面对存在缺失值的数据,有两种选择。一个是给它填充上合理的数据,另外一个就是删除掉相关的数据。本文说的是第二种情况,删除掉数据集的缺失值相关数据,这里说的是“相关数据”,那么意思就是会有正常的数据被主动误伤。

大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码之间的故事。测试环境:python@3.6.8,pandas@1.1.5,numpy@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,是个字符串。

不传递参数,默认
一个参数也不传递的话,就是最常见的用法。
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只有全为Na(how='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 Nonedf.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 Nonedf.dropna( axis=1, subset=[0,1])1,2行数据中,有缺失值的列,被删除【典型的株连九族类型】。输出:
name
0 虎子
1 老许
2 二赖子
3 老白
4 小黑相关文章
- https://newsn.net/say/python-fillna.html
- https://newsn.net/say/python-isnone.html
- https://newsn.net/say/python-isnan.html
结语
更多python经验文章,请参考: