Заменить значение столбца, если не найден столбец данных - PullRequest
1 голос
/ 21 октября 2019

Я новичок в питоне. Здесь у меня есть следующий столбец данных,

  Predict
   100
   200
   2100
   2200
   51200
     0
   3600     

Теперь у меня есть следующий массив данных

cols = [100,156,160,162,200,256,262,2200,2600,2900,3600,4600]

Теперь, я пытаюсь заменить его на 0, если он не находится впрогноз.

Таким образом, результат будет выглядеть как

predict
 100
 200
 0
2200
0
3600

Теперь я попытался

compare_df[~compare_df.isin(cols)] = 0

Но я получаю эту ошибку

TypeError: Cannot do inplace boolean setting on mixed-types with a non np.nan value

Кто-нибудь может мне с этим помочь ? Спасибо.

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Вы должны работать с 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
0 голосов
/ 21 октября 2019

Это Series.where. это лучше, чем np.where, потому что вы должны выполнять присваивание 0 только в том случае, если значение отсутствует в полях.

new_df=df.where(df.isin(cols),0)
print(new_df)

   Predict
0      100
1      200
2        0
3     2200
4        0
5        0
6     3600

Если имеется более 1 столбца:

new_df=df.copy()
new_df['Predict']=df['Predict'].where(df['Predict'].isin(cols),0)
print(new_df)
   Predict
0      100
1      200
2        0
3     2200
4        0
5        0
6     3600

, если они имеют другой тип:

new_df=df.copy()
new_df['Predict']=new_df['Predict'].astype(str) #this or the commented line depending on the type of cols and df ['Predict']
#new_df['predict']=new_df['Predict'].astype(int)
new_df['Predict']=df['Predict'].where(df['Predict'].isin(cols),0)
print(new_df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...