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 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 小黑
相关文章
- https://newsn.net/say/python-fillna.html
- https://newsn.net/say/python-isnone.html
- https://newsn.net/say/python-isnan.html
结语
更多python
经验文章,请参考:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。