在 pandas 布尔比较中保留 NaN 值
Posted
技术标签:
【中文标题】在 pandas 布尔比较中保留 NaN 值【英文标题】:Preserve NaN values in pandas boolean comparisons 【发布时间】:2017-11-30 10:11:51 【问题描述】:我在 pandas 数据框中有两个布尔列 A 和 B,每个都缺少数据(由 NaN 表示)。我想要的是对两列进行 AND 操作,但如果原始列中的任何一个为 NaN,我希望生成的布尔列为 NaN。我有下表:
A B
0 True True
1 True False
2 False True
3 True NaN
4 NaN NaN
5 NaN False
现在当我做df.A & df.B
我想要:
0 True
1 False
2 False
3 NaN
4 NaN
5 False
dtype: bool
但我得到了:
0 True
1 False
2 False
3 True
4 True
5 False
dtype: bool
这种行为与np.bool(np.nan) & np.bool(False)
及其排列一致,但我真正想要的是一个列,它可以确定每行是否对两者都为真,或者肯定不能对两者都为真。如果我知道两者都是 True,那么结果应该是 True,如果我知道至少有一个是 False,那么它应该是 False,否则我需要 NaN 来表明缺少数据。
有没有办法做到这一点?
【问题讨论】:
所需输出中的最后一个值不是NaN
?
使用numpy.logical_and
。
不,只要我知道至少有一个条目是假的,我就知道它们不都是真的。
【参考方案1】:
让我们使用np.logical_and
:
import numpy as np
import pandas as pd
df = pd.DataFrame('A':[True, True, False, True, np.nan, np.nan],
'B':[True, False, True, np.nan, np.nan, False])
s = np.logical_and(df['A'],df['B'])
print(s)
输出:
0 True
1 False
2 False
3 NaN
4 NaN
5 False
Name: A, dtype: object
【讨论】:
你能扩展你对 eq 的答案吗?df.x = df.x.where(pd.isna, df.x == '1')
@EvanBenn 在我看来你正在尝试做一个fillna
。 df.x.fillna(1)
我正在尝试 df.x = NaN if df.x is NaN else df.x == 1
试试这个:df.x.mask(df.x.notnull(),1)
【参考方案2】:
熊猫 >= 1.0
如果您使用新的Nullable Boolean Type boolean
(不要与传统的numpy bool
类型混淆),pandas 直接支持此操作。
# Setup
df = pd.DataFrame('A':[True, True, False, True, np.nan, np.nan],
'B':[True, False, True, np.nan, np.nan, False])
df.dtypes
A object
B object
dtype: object
# A little shortcut to convert the data type to `boolean`
df2 = df.convert_dtypes()
df2.dtypes
A boolean
B boolean
dtype: object
df2['A'] & df2['B']
0 True
1 False
2 False
3 <NA>
4 <NA>
5 False
dtype: boolean
最后,请考虑升级到 pandas 1.0 :-)
【讨论】:
以上是关于在 pandas 布尔比较中保留 NaN 值的主要内容,如果未能解决你的问题,请参考以下文章
pandas 结合两个 dfs:如果任一 df 在该索引处具有空值,则不保留