TypeError: '<' не поддерживается между экземплярами 'str' и 'int' Извлекать только те строки, которые соответствуют двум условиям

У меня есть df, где мне нужно выбрать строки только там, где столбец Condition1 имеет значение 11, а Score положителен

Condition1   Score
11            100
12            100            
11            -2  
11            200
11             11
11            -300
10             200

 Expected output

Condition1   Score
11            100
11            200
11             11

Код:

 df.loc[df.Condition1.eq(11) & (np.sign(df.score) >= 0)]

Получена ошибка

TypeError: '<' not supported between instances of 'str' and 'int'

Я проверил dtype Score и Condition1. Condition1 — это int, а score — это объект, может быть проблема в этом?

df[df.Condition1.eq(11)&df.Score.gt(0)]
wwnde 14.12.2020 05:45

Я только что проверил, моя оценка dtype является объектом, не знаю почему .... это проблема?

noob 14.12.2020 05:47

Яп, df.Score.astype(int).gt(0)

wwnde 14.12.2020 05:49
ValueError: invalid literal for int() with base 10: '3.7'
noob 14.12.2020 05:52

Не понимаю, почему это не должно работать. На какой ты версии. Преобразование Score в str, и это сработало для меня df[df.Condition1.eq(11)&df.Score.astype(int).gt(0)]

wwnde 14.12.2020 05:55

Я использую вывод SAP. Позвольте мне посмотреть, есть ли какие-то пробелы в int и т. д. Не знаю точную проблему.

noob 14.12.2020 05:59

Попробуйте удалить пробелы с помощью df['column'].str.strip(), а затем попробуйте приведенное выше решение.

A DUBEY 14.12.2020 06:08

работает. Спасибо всем :)

noob 14.12.2020 06:19
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
8
330
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вероятно, ваш df содержит в столбце Score текстовое представление чисел, что-то вроде того, что вы создали:

df = pd.DataFrame({'Condition1': [11, 12, 11, 11, 11, 11, 10],
    'Score': ['100', '100  ', '-2 ', '200', ' 11', '-300', ' 200']})

Обратите внимание, что:

  • второй элемент содержит конечные пробелы,
  • 6-й и 8-й элементы содержат начальный пробел.

Когда вы запускаете df.info() результат примерно такой:

 #   Column      Non-Null Count  Dtype 
---  ------      --------------  ----- 
 0   Condition1  7 non-null      int64 
 1   Score       7 non-null      object

но то, что вы видите на экране, выглядит только как цифры.

И это как раз причина, по которой простой astype(int) терпит неудачу: Приведенные выше строки (с начальными или конечными пробелами) не конвертируется в внутр.

Чтобы справиться с вашей проблемой:

  • сначала отбросьте эти пробелы,
  • затем преобразовать этот столбец в int.

Код для этого:

df.Score = df.Score.str.replace(' ', '').astype(int)

Теперь, когда вы запустите df.info(), результат должен быть примерно таким:

 #   Column      Non-Null Count  Dtype
---  ------      --------------  -----
 0   Condition1  7 non-null      int64
 1   Score       7 non-null      int32

И теперь, когда столбец Score представляет собой число, при запуске:

df.loc[df.Condition1.eq(11) & (np.sign(df.Score) >= 0)]

вы должны получить ожидаемый результат.

Примечание. Ваш столбец называется Score (с заглавной буквой «S»), но в вашем образец кода, который вы написали score (со строчной буквой «s»). Не забудьте исправить эта деталь.

Редактировать

Вы можете упростить свою инструкцию, изменив ее на:

df.loc[df.Condition1.eq(11) & (df.Score >= 0)]

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

Похожие вопросы

Selenium.common.exceptions.TimeoutException: ошибка сообщения при отправке текста в поле имени пользователя в iframe с использованием Selenium Python
Веб-скрейпинг на загруженных сайтах Dinamica JS
Как мне изменить размер многоугольника, чтобы он поместился на холсте? Python Ткинтер
Как перейти на последнюю страницу представления Flask-Admin с разбивкой на страницы по умолчанию... без сортировки по убыванию
RuntimeError: работа вне контекста запроса при попытке отправить запрос POST в приложение Flask из другого скрипта Python
Как discord.py обнаруживает, что сообщение отправляется с использованием только сопрограммы, которая определяется в самом коде?
Правильно отображать изображение cv2 массива numpy в wxpython
Python: проверьте, не содержит ли строка в списке строк переменную
Numba/numPy разница в скорости многократного запуска/оптимизация
Эффективный питонический способ умножения элементов (которые являются кортежами) каждой строки, представленной в структуре np.array