#pandas #data-science
Вопрос:
Я пытаюсь очистить и заполнить около 300 столбцов. Я уже заменил все пустые поля на «NaN», и теперь я пытаюсь преобразовать эти значения в 0, если будут пройдены определенные проверки:
- Значения NaN должны присутствовать в столбце.
- В столбце не может уже существовать 0 значений.
- Если 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. Идеальный. Мне особенно нравится логика, стоящая за этим.