Как я могу заменить все значения, отличные от NaN, в кадре данных pandas на 1, но оставить значения NaN в покое? Это почти делает то, что я ищу. Проблема в том, что он также принимает значения 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
1
rwa 27 Фев 2020 в 00:52

2 ответа

Лучший ответ

Вы можете использовать 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
3
G. Anderson 26 Фев 2020 в 22:05

Один из способов - выбрать все ненулевые значения из исходного фрейма данных и установить для них одно значение:

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
4
johnchase 26 Фев 2020 в 22:09