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来显示数据丢失。
有没有办法做到这一点?
让我们使用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)
如果您使用的是新的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 :-)
| 归档时间: |
|
| 查看次数: |
2462 次 |
| 最近记录: |