Pandas заменить все не-NaN-записи в кадре данных на 1, оставив NaN в покое - PullRequest
1 голос
/ 27 февраля 2020

Как можно заменить все значения, отличные от 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

Ответы [ 2 ]

4 голосов
/ 27 февраля 2020

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

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
3 голосов
/ 27 февраля 2020

Вы можете использовать np.where() с DataFrame.isna() для достижения sh этого

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
...