Собесов

Сценарий: типы данных в pandas — где промахи стоят дорого

PythonОчистка данныхСредняяMiddle

Условие

После pd.read_csv user_id стал float, цена — object, дата — строка, флаг подписки — int (0/1). Чем это плохо и как исправить?

Решение

Почему так получается

  • int с NaN → float. Pandas-int не поддерживает NaN, поэтому при единственном пропуске вся колонка станет float64. Решение — Int64 (nullable, с большой буквы).
  • Цена object = в значениях есть нечисловые символы ('1 200', '1,200.50', '—').
  • Дата строкой = parse_dates=['col'] не указан.
  • Флаг 0/1 как int — нормально, но bool экономит память и читается лучше.

Реализация

df['user_id'] = df['user_id'].astype('Int64')  # nullable integer
 
df['price'] = (
    df['price']
    .astype(str)
    .str.replace(' ', '', regex=False)
    .str.replace(',', '.', regex=False)
    .replace({'—': None, '': None})
    .astype('float64')
)
 
df['ts'] = pd.to_datetime(df['ts'], errors='coerce')
 
df['is_subscribed'] = df['is_subscribed'].astype(bool)
 
# Категории с низкой кардинальностью
df['country'] = df['country'].astype('category')

Memory check

print(df.dtypes)
print(df.memory_usage(deep=True).sum() / 1e6, 'MB')

Подводные камни

  1. astype(int) упадёт на NaN — всегда сначала Int64 (nullable) или fillna.
  2. pd.to_datetime(errors='raise') упадёт на первом мусоре. errors='coerce' ставит NaT — обычно лучше.
  3. Конкатенация category + category с разными категориями становится object. Используйте union_categoricals.
  4. Сравнение bool и int работает, но df['flag'] == True иногда возвращает не то, что ждёте. df['flag'].astype(bool).
  5. JSON/CSV не различает int/float — данные нужно явно типизировать на этапе чтения через dtype=.

Эталонный ответ

Nullable Int64 для целых с пропусками, category для низкой кардинальности, pd.to_datetime(errors='coerce') для дат. Типизировать на этапе read_csv(dtype=...), а не после.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти