2013-01-06 68 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 
相關問題