在 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 在我看来你正在尝试做一个fillnadf.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 值的主要内容,如果未能解决你的问题,请参考以下文章

关于保留一列值满足某些约束的行[重复]

为啥 IEEE 754 保留这么多 NaN 值?

pandas 结合两个 dfs:如果任一 df 在该索引处具有空值,则不保留

如何使用布尔数组将np.infs清零数组的所有索引?

多行变量的异常值删除包含 NAN(我需要保留 NAN,NAN 的位置也很重要)[重复]

过滤值小于 0 的 pandas 数据帧的行