April 13, 2022

Ключевые способы преобразования типов датафрейма

Соберем все ключевые способы преобразования типов данных датафрейма вместе. Для примера создадим тренировочный датафрейм:

import pandas as pd
import numpy as np
df = pd.DataFrame([['Петров Иван Иванович', '2022-01',35, 12.3, 'м'], 
                   ['Алексеев Павел Александрович', '2022-02',22, 30, 'м'],
                  ['Запашная Галина Ивановна', '2022-01', 51, np.nan, 'ж']], 
                  columns = ['fio', 'month', 'age', 'revenue', 'gender'])
display(df)
display(df.dtypes)

Дата

Используйте функцию to_datetime библиотеки Pandas, в которой задается колонка и по необходимости формат данных в ней:

pd.to_datetime(df['month'], format='%Y-%m')

Числовые форматы

Функция to_numeric позволяет преобразовать численный формат до ближайшего целого или дробного для экономии места (об этом чуть ниже):

pd.to_numeric(df['age'], downcast='integer')

для дробного:

pd.to_numeric(df['revenue'], downcast='float')

Целое с пропусками

Если столбец с целыми числами содержит пропуски по умолчанию у него будет тип дробного. Однако в последних версиях Pandas есть специальный целочисленный формат - Int64, который позволяет иметь пропуски:

(df['revenue']//10).astype('Int64')

Категориальный формат

Если в колонке небольшой набор значений, то для оптимизации ее можно преобразовать в категориальный формат с помощью класса Pandas - Categorical:

pd.Categorical(df['gender'])

Теперь посмотрим, насколько сокращается используемая память благодаря нашим преобразования. Сэмплируем выборку строк с возвращениями из нашего датафрейма:

df = df.sample(n=1000000, replace=True)
df.info()

Теперь преобразуем типы и выведем новый размер:

df['month'] = pd.to_datetime(df['month'], format='%Y-%m')
df['age'] = pd.to_numeric(df['age'], downcast='integer')
df['revenue'] = pd.to_numeric(df['revenue'], downcast='float')
df['gender'] = pd.Categorical(df['gender'])
df.info()

Как можно заметить, размер сократился почти в два раза.