pandas: устройство, выборка и изменение таблиц

Загрузка CSV с явными типами и датами через read_csv

Содержание курса

Проверка типов через df.dtypes и сквозной пример

После того как read_csv отработал с нужными параметрами, остаётся один вопрос: применились ли они так, как ожидалось? Ответ даёт df.dtypes.

df.dtypes возвращает Series, где индекс — имена столбцов, а значения — их типы. Смотреть его нужно сразу после загрузки, до любой дальнейшей обработки — именно тогда он подтверждает, что параметры dtype и parse_dates сработали корректно.

Разберём на конкретном примере. Возьмём CSV с четырьмя столбцами: id, date, amount, category. Нужны только первые три, id должен быть int32, amountfloat64, а datedatetime64:

import pandas as pd
import io

csv_text = '''id,date,amount,category
1,2024-01-15,99.5,food
2,2024-02-20,150.0,tech
3,2024-03-10,45.25,food
'''

buf = io.StringIO(csv_text)
df = pd.read_csv(
    buf,
    usecols=['id', 'date', 'amount'],
    dtype={'id': 'int32', 'amount': 'float64'},
    parse_dates=['date']
)

print(df.dtypes)

Вывод:

id               int32
date    datetime64[ns]
amount         float64
dtype: object

Это именно то, что задавалось при вызове. category в DataFrame вообще нет — usecols его исключил. id получил int32, а не дефолтный int64. date стал datetime64[ns], а не строкой. amountfloat64.

Если какой-то тип не совпал с ожидаемым, чаще всего причина в одном из двух:

  • Неизвестный ключ в dtype — pandas молча игнорирует его, столбец получает автоматический тип. Например, если написать dtype={'amout': 'float64'} (опечатка), ошибки не будет, но amount окажется float64 лишь случайно (по автовыводу), а намерение останется незамеченным. Проверяйте df.dtypes именно поэтому.
  • Несуществующий столбец в parse_dates — поведение противоположное: pandas бросит ValueError.

Это значит, что имя столбца в parse_dates не совпадает ни с одним столбцом в файле (или он был исключён через usecols). Здесь ошибка видна сразу.

Во всех случаях df.dtypes помогает локализовать проблему: если тип столбца не тот, что ожидался, — ищите опечатку в ключе dtype или проверьте, не исключён ли нужный столбец через usecols.

df.dtypes — тот же атрибут, что уже использовался при ручном создании DataFrame в предыдущем уроке. Разница только в контексте: там он описывал структуру, которую задавали явно через словарь; здесь — подтверждает, что read_csv правильно интерпретировал CSV-файл. Этот же datetime64[ns]-столбец позже станет базой для работы с компонентами дат через .dt — но это уже отдельная тема.