Панды: невозможно установить значение ячейки на основе условия в другом столбце

У меня есть фрейм данных следующим образом:

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.loc[df['Score']==-1,'Bid_Doc_ID']=-1

dubbbdan 14.12.2020 15:22

Это обновление выполняется на месте, вам не нужно назначать его обратно в файл df. Удалите часть df=

Chris 14.12.2020 15:22

Кого-нибудь еще смущает сообщение об ошибке? Я попробовал x = [1,2];x = x[0] = [2,3];print(x) и не ожидал вывода [[...], 3] без ошибки.

Michael Szczesny 14.12.2020 15:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
140
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуйте удалить часть кода, которая присваивает новый 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)

Другие вопросы по теме