'>=' не поддерживается между экземплярами 'str' и 'int' в функциях и использованием лямбда в приложении

avatar
odebear
9 августа 2021 в 04:08
269
1
-2

Я пытаюсь определить функцию, а затем применить ее к фрейму данных, называемому обзорами.

def stars(country, points):
    if country == 'Canada':
        return 3
    elif points >= 95:
        return 3
    elif points >= 85:
        return 2
    else:
        return 1

star_ratings = reviews.apply(lambda x: stars(x['points'], x['country']), axis=1)

Я получаю сообщение об ошибке:

<ipython-input-46-42befd5aa1a8> in stars(country, points)
      2     if country == 'Canada':
      3         return 3
----> 4     elif points >= 95:
      5         return 3
      6     elif points >= 85:

TypeError: '>=' not supported between instances of 'str' and 'int'

Как исправить код, чтобы он заработал? Кроме того, является ли использование лямбда здесь правильной/общепринятой практикой? Спасибо!

Источник
Julien
9 августа 2021 в 04:09
0

что непонятного в ошибке? Ваши данные явно содержат str. Просто сначала преобразуйте их в числа.

Henry Ecker
9 августа 2021 в 04:18
0

Обычно переназначение на основе условий выполняется с помощью np.select вместо лямбды. Как и в Pandas условное создание столбца серии / кадра данных

Aryerez
9 августа 2021 в 04:19
2

Вы отправляете переменные в обратном порядке, чем в определении функции.

tdelaney
9 августа 2021 в 04:46
1

Каков тип данных столбца точек? Это строка? Это действительно помогает включить небольшой образец фрейма данных, который демонстрирует вопрос, поэтому нам не нужно гадать.

Ответы (1)

avatar
Xitiz
9 августа 2021 в 04:17
0

Ваш point находится в string, поэтому вы получаете эту ошибку. Но вы можете решить эту проблему, изменив string на integer. И в функции, которую вы отправляете неправильно, это должно быть points и country, а не country и points.

def stars(points,country):
    if country == 'Canada':
        return 3
    elif int(points) >= 95:
        return 3
    elif int(points) >= 85:
        return 2
    else:
        return 1

star_ratings = reviews.apply(lambda x: stars(x['points'], x['country']), axis=1)
tdelaney
9 августа 2021 в 04:27
0

Откуда вы знаете, что points — это строка? ОП не дает нам достаточно информации, чтобы знать.

Henry Ecker
9 августа 2021 в 04:29
1

Учитывая, что входные данные были перевернуты, вполне вероятно, что преобразование int не нужно и что это просто опечатка из-за неправильного сопоставления аргументов функции.

Xitiz
9 августа 2021 в 04:34
0

@HenryEcker Откуда ты знаешь, что это не нужно? Достаточно ли информации, чтобы это знать? Итак, я дал ответ, который будет работать в любых условиях. И да! Я объяснил, что OP ошибается в аргументе функции и также изменился в коде.

Xitiz
9 августа 2021 в 04:35
0

@tdelaney Да! ОП не предоставил достаточно информации, поэтому я предоставил информацию для любого условия.

tdelaney
9 августа 2021 в 04:43
1

Если столбец точек представляет собой строку, вероятно, было бы лучше исправить фрейм данных, а не пытаться компенсировать это в функциях поддержки.

Xitiz
9 августа 2021 в 04:44
0

@tdelaney Я согласен с тобой. Но это неясно... И я считаю, что проблема ОП уже решена.