Я очищаю некоторый продукт и обнаружил, что одна проблема ниже 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'
Итак, как я могу изменить свое выражение лямбда, чтобы исправить эту проблему?
То, что вы называете "очисткой", на самом деле делает ваши данные грязными. Пандас специализируется на векторизованных операциях. В противном случае использование 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 для числовых данных, и вы будете счастливы.