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

时间:2013-01-06 03:12:23

标签: pandas

我有一个填充了True和False值的数据框,我想从中获取一个数据帧,其中True替换为1,False替换为np.NaN。我尝试过使用dataframe.replace,但是它给了一个填充了所有True的数据框。有没有办法在不使用for循环的情况下完成它,如果是的话?

示例,这是我拥有的数据帧,T为True,F为False(不是字符串'T'和'F';抱歉,无法弄清楚如何在wiki中格式化一个间隔很大的表): / p>

2008-01-02 16:00:00 T T F
2008-01-03 16:00:00 T T T
2008-01-04 16:00:00 T T F
2008-01-07 16:00:00 T T T
2008-01-08 16:00:00 T T F

这是我想将其改为:

2008-01-02 16:00:00 1 1 np.NaN
2008-01-03 16:00:00 1 1 1
2008-01-04 16:00:00 1 1 np.NaN
2008-01-07 16:00:00 1 1 1
2008-01-08 16:00:00 1 1 np.NaN

这些是我试图替换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。

2 个答案:

答案 0 :(得分:8)

applymap()可用于将函数应用于dataframe

的每个元素
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

答案 1 :(得分:1)

试试这个。 where有效,因为默认情况下首次使用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