Pandas 如何将布尔值的数据帧转换为1和np.NaN的数据帧?

Pandas 如何将布尔值的数据帧转换为1和np.NaN的数据帧?,pandas,Pandas,我有一个充满真值和假值的数据帧,我想从中得到一个数据帧,真值替换为1,假值替换为np.NaN。我尝试过使用dataframe.replace,但它给出了一个数据帧,其中包含所有True。有没有不使用for循环和if的方法 例如,这是我拥有的数据帧,T代表True,F代表False(不是字符串“T”和“F”;很抱歉,我不知道如何在wiki中格式化间隔很好的表): 2008-01-02 16:00:00东京时间 2008-01-03 16:00:00 T 2008-01-04 16:00:00东京时

我有一个充满真值和假值的数据帧,我想从中得到一个数据帧,真值替换为1,假值替换为np.NaN。我尝试过使用dataframe.replace,但它给出了一个数据帧,其中包含所有True。有没有不使用for循环和if的方法

例如,这是我拥有的数据帧,T代表True,F代表False(不是字符串“T”和“F”;很抱歉,我不知道如何在wiki中格式化间隔很好的表):

2008-01-02 16:00:00东京时间
2008-01-03 16:00:00 T
2008-01-04 16:00:00东京时间
2008-01-07 16:00:00 T
2008-01-08 16:00:00东京时间

我想将其更改为:

2008-01-02 16:00:00 1新南威尔士州南部
2008-01-03 16:00:00 11
2008-01-04 16:00:00 1新南威尔士州南部
2008-01-07 16:00:00 11
2008-01-08 16:00:00 1北卡罗来纳州南部

这些是我试图替换True和False的行,并得到一个数据帧,其中填充了所有True值:

df.replace(to_replace=True, value=1, inplace=True, method=None)   
df.replace(to_replace=False, value=np.NAN, inplace=True, method=None)  
单独尝试时,仅第一行不会改变任何内容;第二行将所有值转换为True。

applymap()
可用于将函数应用于数据帧的每个元素

In [1]: df = DataFrame([[True, True, False],[False, False, True]]).T

In [2]: df
Out[2]:
       0      1
0   True  False
1   True  False
2  False   True

In [3]: df.applymap(lambda x: 1 if x else np.nan)
Out[3]:
    0   1
0   1 NaN
1   1 NaN
2 NaN   1
您也可以使用
dict

In [4]: d = {True:1, False:np.nan}

In [5]: df.applymap(lambda x: d[x])
Out[5]:
    0   1
0   1 NaN
1   1 NaN
2 NaN   1
从下面回答DSM的评论。我误读了OP,认为datetime是一个索引。如果它不是一个索引,那么这对我来说很有用:

In [6]: df.applymap(lambda x: d.get(x,x))
Out[6]:
    0   1                    2
0   1 NaN  2012-01-01 00:00:00
1 NaN   1  2012-01-01 00:00:00

试试这个
其中
起作用,因为默认情况下,第一次使用
nan
会删除未找到的条目(例如,任何未找到的条目=='T'),然后第二次使用1替换未找到的条目

In [48]: df = pd.DataFrame([ 'T', 'T', 'T', 'F', 'F' ], columns=['value'],index=pd.date_range('20010101',periods=5))

In [49]: df
Out[49]: 
           value
2001-01-01     T
2001-01-02     T
2001-01-03     T
2001-01-04     F
2001-01-05     F

In [50]: df.where(df=='T').where(df!='T',1)
Out[50]: 
           value
2001-01-01     1
2001-01-02     1
2001-01-03     1
2001-01-04   NaN
2001-01-05   NaN

如果第一列由
datetime
实例组成,则此操作将中断。类似于
df.applymap(lambda x:d.get(x,x))
的东西应该绕过它。[我对自己有点恼火,我找不到一个很好的方法来做这件事,但我的前两种方法适用于
“t”
“F”
,但在
True
False
中失败]我对使用异构数据的数据帧做出了回应。谢谢!我对python有点陌生,很欣赏它的改进和指针。我会再次修改我的回答。这似乎不起作用--请再次查看输出。这似乎是因为
DataFrame
中对象的类型实际上是
numpy.bool
,而不是Python的
bool
df=df.applymap(lambda x:1 if x else np.NAN)
——达到了预期的结果。谢谢你的帮助。我在不使用True和False时也遇到了同样的问题,但我认为applymap在应用函数后会返回一个新的数据帧。我见过一些其他的数据帧方法(例如sort)有一个参数“inplace”,它改变了原始的数据帧,但是applymap没有,看起来它返回了一个新的数据帧,所以我必须添加包含显式等号的参数:“df=df.applymap…”。此外,日期列是索引。再次感谢你们两位的帮助。