在pandas布尔比较中维护NaN值

时间:2017-06-27 11:15:16

标签: python pandas boolean missing-data

我在pandas数据框中有两个布尔列A和B,每个都有缺少的数据(由NaN表示)。我想要的是对两列进行AND操作,但是如果原始列中的任何一列是NaN,我希望得到的布尔列为NaN。我有下表:

@import "semantic-ui-less/theme.less";

现在当我做 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 及其排列一致,但我真正想要的是一个列,它告诉我确定两行的每一行是否为True,或者两者都不是True。如果我知道两者都是True,那么结果应该是True,如果我知道它至少为False那么它应该是False,否则我需要NaN来表明数据缺失。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:5)

让我们使用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

答案 1 :(得分:5)

熊猫> = 1.0

只要您使用的是新的Nullable Boolean Type boolean(不要与传统的numpy bool类型混淆),熊猫便可以直接支持此操作。

# 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

最后,请考虑升级到熊猫1.0:-)