目录
- python和pandas中缺失值
- 缺失值的产生和观测
- 缺失值的处理
python和pandas中的缺失值
python的缺失值主要有None,nan,NA三种:
None:是一个特殊的常量,用于表示缺失或不存在的值,它也是一个对象,有自己的类型——NoneType。
它通常用于初始化变量、函数的默认返回值,或者作为占位符,表示某个变量或表达式暂时没有值。
np.nan:Numpy在读入数据集以后数据会被会转为浮点类型(np.float64);而字符型由于无法转化为浮点型,只能归并为object类型。np.nan不能与自己相等。
NA:pd.NA是专门表示缺失值的标量,它代表空整数、空布尔值、空字符,这个功能目前处于实验阶段,因此它的行为仍可能会发生变化。
三者和自己相等的运算结果不同:
print(type(None),type(np.nan),type(pd.NA))
# <class 'NoneType'> <class 'float'> <class 'pandas._libs.missing.NAType'>
print(None==None, np.nan==np.nan, pd.NA==pd.NA)
# True False <NA>
print(None==1, np.nan==1, pd.NA==1)
# False False <NA>
print(pd.NA + 1, np.log(pd.NA), True | pd.NA, False | pd.NA, False & pd.NA)
# <NA> <NA> True <NA> False
# np.nan不能进行逻辑运算
print(np.nan + 1, np.log(np.nan))
# nan nan
print(True | np.nan)
# TypeError: unsupported operand type(s) for |: 'bool' and 'float'
# None不能进行数值和逻辑运算
print(None + 1)
# TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
print(True | None)
# TypeError: unsupported operand type(s) for |: 'bool' and 'NoneType'
# 判断要用is,不能用==
pd.NA == np.nan # <NA>
pd.NA is np.nan # False
None == pd.NA # False
None is pd.NA # False
缺失值的产生和观测
在列表中:
a = [2, 'H', None, np.nan, pd.NA]
a # [2, 'H', None, nan, <NA>]
a[2] is None, a[3] is np.nan, a[4] is pd.NA
# (True, True, True)
# 可以用pd.isna()方法检测空值
pd.isna(a[2]), pd.isna(a[3]), pd.isna(a[4])
# (True, True, True)
在series中:
b = pd.Series([2, 'H', None, np.nan, pd.NA])
b
0 2
1 H
2 None
3 NaN
4 <NA>
dtype: object
b[2] is None, b[3] is np.nan, b[4] is pd.NA
# (True, True, True)
pd.isna(b[2]), pd.isna(b[3]), pd.isna(b[4])
# (True, True, True)
在DataFrame中:
data = [[1, 'Joe', 70000, ], [2, 'Henry', 80000, pd.NA], [3, 'Sam', 60000, None], [4, 'Max', 90000, np.NaN], [4, 'Max', 90000, 1]]
employee = pd.DataFrame(data, columns=['id', 'name', 'salary', 'managerId']).astype({'id':'Int64', 'name':'object', 'salary':'Int64', 'managerId':'Int64'})
employee
id name salary managerId
0 1 Joe 70000 <NA>
1 2 Henry 80000 <NA>
2 3 Sam 60000 <NA>
3 4 Max 90000 <NA>
4 4 Max 90000 1
pd.isna(employee)
employee.isnull()
id name salary managerId
0 False False False True
1 False False False True
2 False False False True
3 False False False True
4 False False False False
pd.isna(employee['managerId'])
employee['managerId'].isnull()
0 True
1 True
2 True
3 True
4 False
Name: managerId, dtype: bool
employee['managerId'][0] is pd.NA
pd.isna(employee['managerId'][0])
True
缺失值的处理
可以参考这篇文章
df.dropna(how='all')#删除所有内容均为缺失值的行
df.dropna(axis=1) #丢弃有缺失值的列
df.dropna(axis=1, how = 'all') #丢弃所有列中所有值均缺失的列
df.dropna(axis=0, subset=['name', 'age'])#丢弃name和age这两列中有缺失值的行