Очистка числовых данных в Pandas с apply + лямбда

1

Я очищаю некоторый продукт и обнаружил, что одна проблема ниже line-

    feed_df['sale_price'] = feed_df['sale_price'].apply(lambda x: x if x > 0 else None)

Здесь я проверил тип данных продажной цены - объект.

Ошибка:

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

Итак, как я могу изменить свое выражение лямбда, чтобы исправить эту проблему?

  • 0
    Когда вы читаете сообщение об ошибке, что вы думаете, что это значит?
  • 0
    цена продажи - строка, и я сравниваю ее с целым числом. Так какой же должен быть правильный путь - изменить лямбда-выражение или поставить чек раньше?
Теги:
pandas
python-3.x
lambda
series

1 ответ

1
Лучший ответ

То, что вы называете "очисткой", на самом деле делает ваши данные грязными. Пандас специализируется на векторизованных операциях. В противном случае использование Pandas было бы немного лучше, чем использование списков и словарей значений.

Это означает, что вы должны убедиться, что числовые ряды имеют числовой тип. Альтернативный object dtype может содержать произвольные типы, но это не что иное, как ряд указателей, похожих на list. С другой стороны, числовая серия будет храниться в памяти как непрерывный блок памяти. Вы увидите улучшения в производительности и использовании памяти.

В этом случае вы можете использовать pd.to_numeric с errors='coerce' а затем обновить серию условно. Значения, которые не могут быть преобразованы в числовые, будут отображаться как NaN.

feed_df['sale_price'] = pd.to_numeric(feed_df['sale_price'], errors='coerce')
feed_df.loc[feed_df['sale_price'] <= 0, 'sale_price'] = np.nan

Обратите внимание: мы используем np.nan вместо None. Это намеренно. NaN ("Не число") считается float, в то время как None является одним из тех произвольных типов, который заставляет Pandas использовать object dtype. Мы этого не хотим. Придерживайтесь числового dtype для числовых данных, и вы будете счастливы.

  • 1
    Спасибо @jpp за объяснение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню