У меня есть 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 — это объект, может быть проблема в этом?
Я только что проверил, моя оценка dtype является объектом, не знаю почему .... это проблема?
Яп, df.Score.astype(int).gt(0)
ValueError: invalid literal for int() with base 10: '3.7'
Не понимаю, почему это не должно работать. На какой ты версии. Преобразование Score
в str
, и это сработало для меня df[df.Condition1.eq(11)&df.Score.astype(int).gt(0)]
Я использую вывод SAP. Позвольте мне посмотреть, есть ли какие-то пробелы в int и т. д. Не знаю точную проблему.
Попробуйте удалить пробелы с помощью df['column'].str.strip()
, а затем попробуйте приведенное выше решение.
работает. Спасибо всем :)
Вероятно, ваш df содержит в столбце Score текстовое представление чисел, что-то вроде того, что вы создали:
df = pd.DataFrame({'Condition1': [11, 12, 11, 11, 11, 11, 10],
'Score': ['100', '100 ', '-2 ', '200', ' 11', '-300', ' 200']})
Обратите внимание, что:
Когда вы запускаете df.info()
результат примерно такой:
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Condition1 7 non-null int64
1 Score 7 non-null object
но то, что вы видите на экране, выглядит только как цифры.
И это как раз причина, по которой простой astype(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)]
df[df.Condition1.eq(11)&df.Score.gt(0)]