我有一个填充了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。
答案 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替换未找到的条目1} p>
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