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

#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)]