python和pandas中的缺失值None、NA和nan及其观测与处理

目录

  • 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这两列中有缺失值的行

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值