2013-01-06 66 views
4

我有一个填充了True和False值的数据框,并且我希望从True中获得一个数据框,并将True替换为1,并将False替换为np.NaN。我试过使用dataframe.replace,但它给了一个填充所有True的数据框。有没有办法做到这一点,而不使用循环和if?例如,这是我拥有的数据框,其中T表示True,F表示False(不是字符串'T'和'F';对不起,无法弄清楚如何在维基上格式化一个空间很大的表格):如何将布尔值的数据帧转换为1和np.NaN的数据帧?

2008-01-02 16时00分00秒TTF
2008-01-03 16时00分00秒TTT
2008-01-04 16时00分00秒TTF
2008-01-07 16: 00:00 TTT
2008-01-08 16:00:00 TTF

这就是我想改成它:

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 111
2008-01-08 16:00:00 1 1 np.NaN

这些都是我试图取代真假行,有一个数据帧充满了真实值:

df.replace(to_replace=True, value=1, inplace=True, method=None) 
df.replace(to_replace=False, value=np.NAN, inplace=True, method=None) 

当分开审讯,第一行本身并不改变任何东西;第二行将所有值转换为True。

回答

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,并假定日期时间是一个索引。如果它不是一个索引,这对我有效:

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

这将打破,如果第一列由'datetime'实例组成。像'df.applymap(lambda x:d.get(x,x))'应该绕过这个。 [我有点讨厌自己,我找不到一个好的方法来做到这一点,但我的前两种方法与''T''和''F''一起工作,但失败了'真'和'假'。 ] – DSM

+0

我赞赏我对使用异构数据的数据框的工作做出的反应。 – Zelazny7

+0

谢谢!我对python有点新鲜,并且非常欣赏这些改进和指针。我会再次修改我的回复。 – Zelazny7

1

试试这个。 where作品,因为在默认情况下nan第一次使用s出的未找到条目(例如未==“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 
相关问题