У меня есть фрейм данных следующим образом:
ID Score Bid_Doc_ID
1 67 3
2 -1 2
3 -1 7
Я хочу установить в поле Bid_Doc_ID
значение -1, где Score
== -1
Для этого я использую следующий код:
df = df.loc[df['Score']==-1,'Bid_Doc_ID']=-1
И я получаю следующую ошибку:
AttributeError: 'int' object has no attribute 'loc'
Даже я пробовал:
df = df.loc[df['Score'].astype(str)==-1,'Bid_Doc_ID']=-1
Все еще получаю ту же ошибку.
Мой ожидаемый результат:
ID Score Bid_Doc_ID
1 67 3
2 -1 -1
3 -1 -1
Проблема кажется довольно тривиальной, но я что-то упускаю!
Это обновление выполняется на месте, вам не нужно назначать его обратно в файл df. Удалите часть df=
Кого-нибудь еще смущает сообщение об ошибке? Я попробовал x = [1,2];x = x[0] = [2,3];print(x)
и не ожидал вывода [[...], 3]
без ошибки.
Попробуйте удалить часть кода, которая присваивает новый df
:
df = df.loc[df['Score']==-1,'Bid_Doc_ID']=-1 # change
df.loc[df['Score']==-1,'Bid_Doc_ID']=-1 # to be this
Или, как вариант, вы можете получить то, что вам нужно, используя np.where
?
import numpy as np
df['Bid_Doc_ID'] = np.where(df['Score'] == -1, -1, df['Bid_Doc_ID'])
Когда вы запустили df = df.loc[df['Score'].astype(str)==-1,'Bid_Doc_ID']=-1
, похоже, вы перезаписали свой df целым числом или логическим значением (вот почему ошибка 'int' object has no attribute 'loc'
). Попробуйте проверить значение df, чтобы убедиться в этом.
Это произойдет во многих случаях, если вы измените DF на месте, что никогда не бывает хорошей идеей, всегда лучше назначить измененный фрейм данных новой переменной, например. df_fixed
, это сэкономит вам много времени на отладку или, что еще хуже, на исправление ошибок в продакшене.
Попробуйте следующее, это не слишком лаконично, но в нем используются чистые методы pandas и цепочки методов, что рекомендуется в наши дни.
bid_doc_id_fixed = df.apply(lambda x: -1 if x['Score'] == -1 else x['Bid_Doc_ID'], axis=1)
df_fixed = df.assign(Bid_Doc_ID=bid_doc_id_fixed)
попробуйте удалить первый
df =
. Простоdf.loc[df['Score']==-1,'Bid_Doc_ID']=-1