如何用1替换数据帧的所有非NaN条目,用0替换所有NaN

Ani*_* De 16 python dataframe pandas

我有一个71列和30597行的数据帧.我想用1替换所有非nan条目,用0替换nan值.

最初,我尝试对数据帧的每个值进行for循环,这花费了太多时间.

然后我使用了data_new = data.subtract(data),这意味着将数据帧的所有值减去它自己,这样我就可以使所有非空值为0.但是由于数据帧有多个字符串条目,所以发生错误.

fma*_*arc 25

你可以采取的返回值df.notnull(),这是False在数据帧中包含NaNTrue否则将其丢至整数,让您0在数据帧是NaN1其他方式:

newdf = df.notnull().astype('int')
Run Code Online (Sandbox Code Playgroud)

如果你真的想写入原始的DataFrame,这将有效:

df.loc[~df.isnull()] = 1  # not nan
df.loc[df.isnull()] = 0   # nan
Run Code Online (Sandbox Code Playgroud)

  • 您是否注意到我在您面前发布了此答案? (2认同)

jez*_*ael 12

使用notnull与铸造布尔值,int通过astype:

print ((df.notnull()).astype('int'))
Run Code Online (Sandbox Code Playgroud)

样品:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [np.nan, 4, np.nan], 'b': [1,np.nan,3]})
print (df)
     a    b
0  NaN  1.0
1  4.0  NaN
2  NaN  3.0

print (df.notnull())
       a      b
0  False   True
1   True  False
2  False   True

print ((df.notnull()).astype('int'))
   a  b
0  0  1
1  1  0
2  0  1
Run Code Online (Sandbox Code Playgroud)


tom*_*ler 5

我建议制作一个新专栏而不是仅仅替换。如有必要,您始终可以删除前一列,但通过对另一列的操作填充一列的源总是很有帮助的。

例如,如果 df['col1'] 是现有列

df['col2'] = df['col1'].apply(lambda x: 1 if not pd.isnull(x) else np.nan)
Run Code Online (Sandbox Code Playgroud)

其中 col2 是新列。如果 col2 有字符串条目,也应该有效。