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

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

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

Явные типы и разбор дат: параметры dtype и parse_dates

Автоматический вывод типов, который pandas делает при чтении CSV, работает предсказуемо для чисел, но часто ошибается в деталях: столбец с целыми числами получает int64, хотя для экономии памяти лучше подошёл бы int32; столбец с ценами может стать object, если в нём встречается запятая вместо точки. Чтобы не исправлять это постфактум через astype, нужные типы задаются прямо при чтении через параметр dtype.

Параметр dtype

dtype принимает словарь, где ключ — имя столбца, значение — нужный тип:

import pandas as pd

df = pd.read_csv(
    'data/orders.csv',
    dtype={
        'id': 'int32',
        'amount': 'float64',
        'category': 'str'
    }
)

В качестве типов работают строки NumPy/pandas ('int32', 'float64', 'Int64' с заглавной I для nullable-целых) и Python-типы (str, float). Pandas применяет преобразование во время чтения, поэтому никаких отдельных вызовов astype после загрузки не нужно.

Если в файле окажется значение, которое нельзя привести к указанному типу, pandas бросит ValueError — и это хорошо: ошибка сразу сигнализирует о грязных данных, а не прячется в неожиданном NaN где-то внутри DataFrame.

Один нюанс: столбцы, которые не указаны в словаре dtype, получают тип автоматически, как обычно. Словарь не обязан покрывать все столбцы.

Параметр parse_dates

Даты — отдельная история. Даже если в файле написано 2024-01-15, pandas по умолчанию читает это как строку (object). Чтобы столбец стал datetime64[ns] прямо при загрузке, используется parse_dates:

df = pd.read_csv(
    'data/orders.csv',
    parse_dates=['date']
)

parse_dates принимает список имён столбцов (или позиций). Pandas пытается распознать формат автоматически — ISO-8601 (YYYY-MM-DD) он обрабатывает без проблем. Для нестандартных форматов вроде 15/01/2024 автораспознавание может не сработать, и тогда потребуется дополнительный шаг уже после загрузки. Но для большинства реальных датасетов, где дата записана в стандартном виде, parse_dates закрывает задачу полностью.

Оба параметра прекрасно работают вместе:

df = pd.read_csv(
    'data/orders.csv',
    dtype={'id': 'int32', 'amount': 'float64'},
    parse_dates=['date']
)

Такой вызов даёт id типа int32, amount типа float64, date типа datetime64[ns] — всё в один шаг, без постобработки. Как убедиться, что типы действительно применились корректно, разберём в следующей секции.