Вы должны работать с Series
вместо одного столбца DataFrame
, выбрав с именем столбца и loc
для замены значений Predict
:
compare_df.loc[~compare_df['Predict'].isin(cols), 'Predict'] = 0
Если удалить loc
симя столбца устанавливает все строки на 0
по маске (если существует):
compare_df[~compare_df['Predict'].isin(cols)] = 0
Если используется альтернативный вариант с numpy.where
, также выберите столбец Predict
:
compare_df['Predict'] = np.where(compare_df['Predict'].isin(cols),compare_df['Predict'], 0)
Но здесь также работает:
compare_df['Predict'] = np.where(compare_df.isin(cols),compare_df, 0)
РЕДАКТИРОВАТЬ:
Для сравнения нужны те же типы в столбце и в списке, например, числовые или объекты (очевидно, строки).
Так что необходимо для обеих строк значения:
cols = [str(x) for x in cols]
compare_df.loc[~compare_df['Predict'].isin(cols), 'Predict'] = 0
Или для обоих чисел:
compare_df['Predict'] = compare_df['Predict'].astype(float)
compare_df.loc[~compare_df['Predict'].isin(cols), 'Predict'] = 0
Если не работает приведение к поплавкам с помощью .astype(float)
:
compare_df['Predict'] = pd.to_numeric(compare_df['Predict'], errors='coerce')
compare_df.loc[~compare_df['Predict'].astype(float).isin(cols), 'Predict'] = 0