我在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来表明数据缺失。
有没有办法实现这个目标?
答案 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)
只要您使用的是新的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:-)