Pandas 将数据帧的所有非 NaN 条目替换为 1,保留 NaN

Pandas replace all non-NaN entries of a dataframe with 1 leave NaN alone

如何将 pandas 数据帧中的所有非 NaN 值替换为 1 但保留 NaN 值? This 几乎可以满足我的要求。问题是它也使 NaN 值为 0。然后我必须在之后将它们重置为 NaN。

我想要这个

    a    b
0  NaN  QQQ
1  AAA  NaN
2  NaN  BBB

变成这样

    a    b
0  NaN   1
1   1   NaN
2  NaN   1

这段代码几乎就是我想要的

newdf = df.notnull().astype('int')

上面的代码就是这样做的

    a    b
0   0   1
1   1   0
2   0   1

一种方法是select原始数据框中的所有非空值并将它们设置为一个:

df[df.notnull()] = 1

此解决方案适用于您的数据:

df = pd.DataFrame({'a': [np.nan, 'AAA', np.nan], 'b': ['QQQ', np.nan, 'BBB']})
df[df.notnull()] = 1

df 
    a   b
0   NaN 1
1   1   NaN
2   NaN 1

您可以使用 np.where()DataFrame.isna() 来完成这个

df=pd.DataFrame(data=[[1,np.NaN,5],
                      ['q',np.NaN,np.NaN],
                      ['7',{'a':1},np.NaN]],
                columns=['a','b','c'])

    a   b           c
0   1   NaN         5.0
1   q   NaN         NaN
2   7   {'a': 1}    NaN

df1=pd.DataFrame(np.where(df.isna(),df,1), columns=df.columns)

    a   b       c
0   1   NaN     1
1   1   NaN     NaN
2   1   1       NaN