#python #python-3.x #pandas
#python #python-3.x #панды
Вопрос:
У меня есть df, где мне нужно выбирать строки только там, где столбец Condition1 имеет значение 11, а оценка положительная
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) amp; (np.sign(df.score) >= 0)]
Получена ошибка
TypeError: '<' not supported between instances of 'str' and 'int'
Я проверил dtype Score и Condition1 . Condition1 — это int, а оценка — объект, может ли это быть проблемой?
Комментарии:
1.
df[df.Condition1.eq(11)amp;df.Score.gt(0)]
2. Я только что проверил, мой счет dtype — объект, не знаю why….is в чем проблема?
3. Yap,
df.Score.astype(int).gt(0)
4.
ValueError: invalid literal for int() with base 10: '3.7'
5. Не понимаю, почему это не должно работать. На какой версии вы находитесь. Преобразовано
Score
вstr
, и это сработало для меняdf[df.Condition1.eq(11)amp;df.Score.astype(int).gt(0)]
Ответ №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 .
Чтобы справиться с вашей проблемой:
- сначала удалите эти пробелы,
- затем преобразуйте этот столбец в 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) amp; (np.sign(df.Score) >= 0)]
вы должны получить ожидаемый результат.
Примечание: ваш столбец называется Score (с прописными буквами «S»), но в вашем примере кода вы написали score (со строчными буквами «s»). Не забудьте исправить эту деталь.
Редактировать
Вы можете упростить свою инструкцию, изменив ее на:
df.loc[df.Condition1.eq(11) amp; (df.Score >= 0)]