2015-07-29 4 views
5

Принимая во внимание, что df.fillna(0) заполняет все значения NA/NaN с помощью 0, существует ли функция для замены всех значений не -NA/NaN с другим значением, например 1?Pandas напротив fillna (0)

Если значения в моем DataFrame списки переменной длины, то:

  • df.replace() требует, чтобы списки имеют одинаковую длину
  • логический индекс, как df[len(df) > 0] = 1 бросает ValueError: cannot insert True, already exists
  • pandas.get_dummies() бросает TypeError: unhashable type: 'list'

Есть ли более простое решение?

ответ

4

Вы можете использовать индексацию/назначение с df[df.notnull()] = 1. Например:

>>> df = pd.DataFrame([[np.nan, 2, 5], [2, 5, np.nan], [2, 5, np.nan]]) 
>>> df # example frame 
    0 1 2 
0 NaN 2 5 
1 2 5 NaN 
2 2 5 NaN 

>>> df[df.notnull()] = 1 
>>> df 
    0 1 2 
0 NaN 1 1 
1 1 1 NaN 
2 1 1 NaN 
1

Я не знаю, о встроенной функции, но это работает:

import pandas as pd 
import numpy as np 

df = pd.DataFrame(data={'a':[np.nan, 13, 32]}) 

>> a 
    0 NaN 
    1 13 
    2 32 

df = df.applymap(lambda x: 1 if not np.isnan(x) else x) 

>>  a 
    0 NaN 
    1 1 
    2 1 
+0

мне пришлось использовать что-то вроде 'isinstance (х, список)' вместо 'numpy.isnan (х)', чтобы предотвратить получение 'TypeError', но с использованием лямбда-функции действительно решает проблему. – interpolack