Функция для замены всех значений NaN на ноль:

#pandas #data-science

Вопрос:

Я пытаюсь очистить и заполнить около 300 столбцов. Я уже заменил все пустые поля на «NaN», и теперь я пытаюсь преобразовать эти значения в 0, если будут пройдены определенные проверки:

  1. Значения NaN должны присутствовать в столбце.
  2. В столбце не может уже существовать 0 значений.
  3. Если 0 уже существует, замените его на 0.1. (Я все еще пытаюсь понять, чем заменить, так как 0 уже содержит соответствующую информацию для этого конкретного столбца во фрейме данных)

до сих пор я реализовывал

 def convert(df, col):
  if (df[col].isnull().sum() > 0): #amp; (df[df[col] != '0'])
  #if (df[df[col] != '0']): 
    df[col].replace(np.NaN, '0', inplace = True) 

for col in df.columns: 
  convert(df, col)
 

Но проверка второго условия (в столбце уже не может быть нулей) не работает. Попытался реализовать это (закомментированная часть), но возвращает следующую ошибку:

 TypeError: Cannot perform 'rand_' with a dtyped [float64] array and scalar of type [bool]
 

В другом примечании, касающемся области науки о данных; Я не уверен, следует ли заменять пустые поля некоторых столбцов средним значением столбца вместо 0. У меня есть функции, описывающие вес, размеры, цены и т. Д.

Комментарии:

1. Что вы подразумеваете под «значениями NaN, которые должны присутствовать в столбце»?

2. Я уже заменил все пустые поля на «df = df.replace(‘?’, np.NaN)». Но я полагаю, что первая проверка на самом деле не нужна.

Ответ №1:

Используйте логическую маску.

Предположим, что следующий фрейм данных:

 >>> df
     A  B    C
0  0.0  1  2.0
1  NaN  4  5.0  # <- NaN should be replace by 0.1
2  6.0  7  NaN  # <- NaN should be replace by 0
 
 m1 = df.isna().any()  # Is there a NaN in columns (not mandatory)
m2 = df.eq(0).any()   # Is there a 0 in columns

# Replace by 0
df.update(df.loc[:, m1 amp; ~m2].fillna(0))

# Replace by 0.1
df.update(df.loc[:, m1 amp; m2].fillna(0.1))
 

Полезна только вторая маска

Выходной результат:

 >>> df
     A  B    C
0  0.0  1  2.0
1  0.1  4  5.0
2  6.0  7  0.0
 

Комментарии:

1. Идеальный. Мне особенно нравится логика, стоящая за этим.