在熊猫布尔比较中保持NaN值

Wil*_*ant 5 python boolean missing-data 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
Run Code Online (Sandbox Code Playgroud)

现在,当df.A & df.B我想要时:

0    True
1    False
2    False
3    NaN
4    NaN
5    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

但是我得到了:

0    True
1    False
2    False
3    True
4    True
5    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

此行为np.bool(np.nan) & np.bool(False)与其排列是一致的,但是我真正想要的是一列,该字段告诉我确定每一行对于两者而言是否为True,或者对于某些情况而言一定不能为True。如果我都知道它为True,则结果应该为True,如果我知道至少一个结果为False,则结果应该为False,否则我需要NaN来显示数据丢失。

有没有办法做到这一点?

Sco*_*ton 8

让我们使用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)
Run Code Online (Sandbox Code Playgroud)

输出:

0     True
1    False
2    False
3      NaN
4      NaN
5    False
Name: A, dtype: object
Run Code Online (Sandbox Code Playgroud)


cs9*_*s95 7

熊猫 >= 1.0

如果您使用的是新的Nullable Boolean 类型boolean(不要与传统的 numpybool类型混淆),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
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)

总之,请考虑升级到 pandas 1.0 :-)