Pandas 将包含0、1和NaN的系列重新编码为False、True和NaN

Pandas 将包含0、1和NaN的系列重新编码为False、True和NaN,pandas,Pandas,假设我有一个关于NaNs的系列: pd.Series([0, 1, None, 1]) 我想将其转换为: pd.Series([False, True, None, True]) 您可能认为x==1就足够了,但实际上,它返回: pd.Series([False, True, False, True]) 其中空值已变为False。这是因为np.nan==1返回False,而不是像R中那样返回None或np.nan 有没有一种很好的矢量化方法可以得到我想要的东西?您可以在以下位置使用: In

假设我有一个关于NaNs的系列:

pd.Series([0, 1, None, 1])
我想将其转换为:

pd.Series([False, True, None, True])
您可能认为
x==1
就足够了,但实际上,它返回:

pd.Series([False, True, False, True])
其中空值已变为
False
。这是因为
np.nan==1
返回
False
,而不是像R中那样返回
None
np.nan

有没有一种很好的矢量化方法可以得到我想要的东西?

您可以在以下位置使用:

In [11]: (s == 1).where(s.notnull(), np.nan)
Out[11]:
0     0
1     1
2   NaN
3     1
dtype: float64
注意:True和False已被转换为浮点0和1。

可能可以:

import pandas as pd

x = pd.Series([0, 1, None, 1])

print x.map({1: True, 0: False})

0    False
1     True
2      NaN
3     True
dtype: object

data=data.astype(bool)
应该给出你想要的。@MaxNoe不,这会将NaNs改为
True
(至少在pandas 0.17.1中是这样)。也许我遗漏了什么,但这不正是让我回到原点吗?0s和1s是我试图替换的对象。@Kodiologist如果有2s和3s,它们也将被设置为false->0。@Kodiologist也没有使用nan的布尔(或int)类型,您必须使用比float效率低/慢的对象。
x.map({0:false,1:True})
单独使用似乎就足够了。也许这是最好的办法。