0Pricing
Pandas & NumPy Academy · Урок

Проверка типов данных столбцов

Изучите атрибут dtypes, различайте int64, float64 и object и находите столбцы, требующие преобразования.

«Проверка типов данных столбцов» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Почему важны типы данных столбцов

Каждый столбец DataFrame Pandas имеет dtype (тип данных), который определяет способ хранения значений в памяти и допустимые операции над ними. Столбец с целыми числами и dtype object (строковым типом) нельзя суммировать как числовой. Дата, сохранённая как строка, воспринимается как текст, а не как временной ряд. Неправильные dtype — одна из самых частых причин незаметных ошибок и неожиданных результатов в конвейерах анализа данных.

Всегда проверяйте dtype сразу после загрузки нового набора данных.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'age': ['25', '30', '35'],      # looks like int, stored as object
    'salary': [50000, 60000, 70000], # int64
    'hired': ['2022-01-01', '2023-06-15', '2024-03-10']  # looks like date
})

print(df.dtypes)
# age       object
# salary     int64
# hired     object
# dtype: object

Атрибут dtypes

DataFrame.dtypes возвращает Series, индексом которого являются имена столбцов, а значениями — dtype каждого столбца в Pandas. Часто встречаются dtype int64, float64, object (строки и смешанные данные), bool, datetime64[ns] и category. Название dtype сообщает и вид данных, и объём памяти в байтах, необходимый для хранения каждого значения.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'int_col': [1, 2, 3],
    'float_col': [1.5, 2.5, 3.5],
    'str_col': ['a', 'b', 'c'],
    'bool_col': [True, False, True]
})

print(df.dtypes)
# int_col      int64
# float_col  float64
# str_col     object
# bool_col      bool
# dtype: object

Определение типа object

Тип object — универсальный тип Pandas для столбцов, которые нельзя хранить как числовые или логические данные. Обычно он означает строковые данные, но может также указывать на столбец со смешанными типами (например, на числа и строки одновременно). Столбцы object занимают больше памяти, чем специализированные типы, и операции над ними выполняются медленнее. Увидев object, спросите себя: должен ли это быть текст, число, категория или дата?

import pandas as pd

df = pd.DataFrame({'mixed': [1, 'two', 3.0, None]})
print(df.dtypes)
# mixed    object

# Check actual Python types inside the column
print(df['mixed'].apply(type).value_counts())
# <class 'int'>      1
# <class 'str'>      1
# <class 'float'>    2  (includes NaN which is float)

info() для полного обзора типов

df.info() выводит компактную таблицу с именем каждого столбца, количеством непустых значений и dtype, а также с общим объёмом используемой памяти. Эта одна команда даёт полную картину качества набора данных: одновременно показывает, в каких столбцах есть пропуски и какие имеют неправильные dtype. Поэтому это стандартная первая команда после загрузки набора данных.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'id': [1, 2, 3],
    'score': [88.5, 92.0, np.nan],
    'grade': ['A', 'A', 'B']
})

df.info()
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 3 entries, 0 to 2
# Data columns (total 3 columns):
#  #   Column  Non-Null Count  Dtype
# ---  ------  --------------  -----
#  0   id      3 non-null      int64
#  1   score   2 non-null      float64
#  2   grade   3 non-null      object
# dtypes: float64(1), int64(1), object(1)
# memory usage: 200.0+ bytes

Распространённые проблемы с dtype после read_csv

При чтении CSV-файла Pandas определяет dtype, анализируя значения. Возникают несколько распространённых проблем: числовые столбцы считываются как object, если содержат разделители тысяч в виде запятых или символы валют; логические столбцы считываются как object, если хранятся как строки «Yes»/«No»; а столбцы с датами считываются как object, поскольку Pandas не разбирает даты без соответствующего указания. Знание этих закономерностей позволяет быстро исправлять их преобразованием типов.

import pandas as pd
import io

csv = '''price,date,is_active
'1,200',2024-01-15,Yes
'800',2024-02-20,No
'''

df = pd.read_csv(io.StringIO(csv))
print(df.dtypes)
# price       object    <- should be int
# date        object    <- should be datetime64
# is_active   object    <- should be bool

Использование памяти разными dtype

Разные dtype требуют совершенно разного объёма памяти. Столбец int64 использует 8 байт на значение, тогда как столбец object с короткими строками может использовать 50–200 байт на значение. Для DataFrames с миллионами строк правильный выбор dtype способен уменьшить объём памяти с гигабайт до мегабайт. Вызовите df.memory_usage(deep=True), чтобы увидеть стоимость хранения каждого столбца в байтах.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'int64_col': np.arange(1_000_000, dtype='int64'),
    'float32_col': np.arange(1_000_000, dtype='float32'),
    'obj_col': ['a'] * 1_000_000
})

mem = df.memory_usage(deep=True) / 1024**2  # MB
print(mem.round(2))
# Index         0.00
# int64_col     7.63
# float32_col   3.81
# obj_col      55.26  <- much more for object!

Обнаружение числовых столбцов с неправильным типом

Распространённая проблема — числовой столбец, сохранённый как object из-за случайных символов форматирования. Обнаружить её можно, проверив, отличается ли результат pd.to_numeric(df['col'], errors='coerce') от исходного столбца. Значения, которые нельзя разобрать, превращаются в NaN, поэтому Вы сразу видите, какие строки привели к ошибке определения типа.

import pandas as pd

df = pd.DataFrame({'revenue': ['1000', '2000', '$3000', '4,000']})

# Check which values can't be parsed as numbers
parsed = pd.to_numeric(df['revenue'], errors='coerce')
print(parsed)
# 0    1000.0
# 1    2000.0
# 2       NaN   <- '$3000' failed
# 3       NaN   <- '4,000' failed

Проверка неоднозначности между целым и вещественным типом

Когда в столбце есть значения NaN, Pandas хранит целочисленные столбцы как float64, потому что стандартные целочисленные типы NumPy не могут представлять NaN. В результате значения с плавающей точкой, такие как 25.0, выглядят как целые числа, но хранятся как числа с плавающей точкой. В Pandas появились целочисленные типы с поддержкой пропущенных значений (Int64 с заглавной I), которые поддерживают NaN, сохраняя семантику целых чисел.

import pandas as pd
import numpy as np

df = pd.DataFrame({'count': [1, 2, np.nan, 4]})
print(df['count'].dtype)  # float64 — because NaN is float

# Nullable integer type supports NaN
df['count'] = df['count'].astype('Int64')  # capital I!
print(df)
#    count
# 0      1
# 1      2
# 2   <NA>
# 3      4
print(df['count'].dtype)  # Int64

select_dtypes() для фильтрации по типу

df.select_dtypes(include=) позволяет выбрать все столбцы, принадлежащие к определённому семейству типов. Распространённые аргументы: 'number' (все числовые), 'object' (строки), 'bool', 'datetime', 'category'. Это особенно полезно в начале конвейера: так можно применять очистку числовых данных только к числовым столбцам, а очистку строк — только к текстовым.

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob'],
    'age': [25, 30],
    'salary': [50000.0, 70000.0],
    'dept': ['Eng', 'HR']
})

numeric = df.select_dtypes(include='number')
print('Numeric columns:', numeric.columns.tolist())
# ['age', 'salary']

text = df.select_dtypes(include='object')
print('Text columns:', text.columns.tolist())
# ['name', 'dept']

Создание отчёта о типах данных

Практика EDA — составлять отчёт о типах данных, в котором для каждого столбца указаны его тип данных, количество уникальных значений и примеры значений. Это помогает быстро определить, какие столбцы нужно преобразовать до начала анализа. Такой отчёт можно создать с помощью простого DataFrame, построенного на основе агрегирования по столбцам.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'age': [25, 30, 35],
    'salary': [50000, 60000, 70000],
    'dept': ['Eng', 'HR', 'Eng'],
    'hired': ['2022-01-01', '2023-06-15', '2024-03-10']
})

report = pd.DataFrame({
    'dtype': df.dtypes,
    'unique_count': df.nunique(),
    'sample': df.iloc[0]
})
print(report)

Согласованность типов данных в рабочих конвейерах

В рабочих конвейерах, которые каждый день обрабатывают новые данные, типы данных могут изменяться: столбец, всегда имевший тип int64, может прийти как float64, если в нём появится хотя бы одно значение NaN. Добавьте проверки типов данных в начало конвейера, чтобы своевременно обнаруживать изменения схемы. Явная остановка с понятной ошибкой гораздо лучше, чем незаметное получение неправильных результатов на следующих этапах.

import pandas as pd

df = pd.DataFrame({'user_id': [1, 2, 3], 'score': [88.0, 92.0, 76.0]})

expected_dtypes = {'user_id': 'int64', 'score': 'float64'}

for col, expected in expected_dtypes.items():
    actual = str(df[col].dtype)
    assert actual == expected, (
        f'Column {col}: expected {expected}, got {actual}'
    )
print('All dtypes are correct')

Быстрая проверка

Проверьте, насколько хорошо Вы умеете изучать типы данных столбцов.

Итоги урока

В этом уроке Вы узнали: df.dtypes показывает тип каждого столбца, тип object служит универсальным типом для строк и смешанных данных, а df.info() предоставляет полный обзор типов и возможности содержать пропущенные значения. Используйте select_dtypes(), чтобы фильтровать столбцы по семейству типов, и добавляйте проверки типов данных, чтобы обнаруживать изменения схемы в рабочих системах. Далее мы преобразуем столбцы к правильным типам данных с помощью astype().

Часто задаваемые вопросы

Урок «Проверка типов данных столбцов» бесплатный?

Да — полный текст урока «Проверка типов данных столбцов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Чему я научусь в уроке «Проверка типов данных столбцов»?

Изучите атрибут dtypes, различайте int64, float64 и object и находите столбцы, требующие преобразования. Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?

Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Проверка типов данных столбцов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?

Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Проверка типов данных столбцов
  2. Приведение типов с помощью astype()
  3. Категориальный тип данных
  4. Корректный разбор дат
← Назад к Pandas & NumPy Academy