Нашли ошибку?
среднийpandas 3.0.6

Типы данных

Привести столбцы к правильным типам — числа из строк, целые с пропусками, логические значения.

Нужно знать:Первичный осмотр

Содержание статьи

Коротко

  • Основные типы: int64, float64, bool, str, datetime64, category. Посмотреть — df.dtypes.
  • astype(тип) или astype({"col": тип}) — привести столбцы; падает на первом неподходящем значении.
  • pd.to_numeric(s, errors="coerce") превращает в число всё, что можно, а остальное — в NaN.
  • Nullable-типы с заглавной буквы — Int64, Float64, boolean, string — хранят пропуск как pd.NA, не меняя тип: целые остаются целыми.
  • convert_dtypes() подбирает nullable-типы для всей таблицы.

Синтаксис

df.dtypes
df.astype({"qty": "int64", "price": "float64"})
pd.to_numeric(s, errors="raise", downcast=None)
pd.Series(values, dtype="Int64")      # "Float64", "boolean", "string"
df.convert_dtypes()

Параметры

ПараметрЧто делаетПо умолчанию
dtypeв astype: тип или словарь {"столбец": тип}обязательный
errorsв to_numeric: "raise" — ошибка, "coerce" — NaN для неподходящих значений"raise"
downcastв to_numeric: "integer", "float" — выбрать самый компактный типNone
Тип Что хранит Пропуск
int64 целые нельзя — столбец станет float64
Int64 целые pd.NA
float64 дробные NaN
bool / boolean логические нельзя / pd.NA
str строки (по умолчанию в pandas 3) NaN
category повторяющиеся значения из набора NaN

Примеры

Данные для примеровиспользуются во всех примерах ниже
raw = pd.DataFrame({
    "id": ["001", "002", "003"],
    "price": ["120.5", "95", "нет"],
    "qty": ["3", "10", "7"],
    "vip": ["True", "False", "True"],
})
Что прочиталось
raw.dtypes                                     # всё прочитано как строки
Вывод
id       str
price    str
qty      str
vip      str
dtype: object
astype
typed = raw.astype({"qty": "int64"})
typed.dtypes
Вывод
id         str
price      str
qty      int64
vip        str
dtype: object
to_numeric с errors='coerce'
pd.to_numeric(raw["price"], errors="coerce")   # «нет» → NaN вместо ошибки
Вывод
0    120.5
1     95.0
2      NaN
Name: price, dtype: float64
Целые с пропусками: Int64
counts = pd.Series([3, None, 5], dtype="Int64")
print(counts)
counts + 1                                     # пропуск остаётся пропуском, целые — целыми
Вывод
0       3
1    <NA>
2       5
dtype: Int64
0       4
1    <NA>
2       6
dtype: Int64
convert_dtypes
pd.DataFrame({"n": [1, None], "s": ["a", None]}).convert_dtypes().dtypes
Вывод
n     Int64
s    string
dtype: object

convert_dtypes выбирает для строк тип string с пропуском pd.NA, а обычный тип по умолчанию — str с пропуском NaN.

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

astype падает на первом плохом значении

Строка «нет» в числахошибка: ValueError
raw["price"].astype(float)
Ошибка
ValueError: could not convert string to float: 'нет'

astype(bool) для строк

Любая непустая строка — True, включая "False". Переводите через словарь.

Строки «True» / «False»
print(raw["vip"].astype(bool).tolist())        # непустая строка — всегда True
raw["vip"].map({"True": True, "False": False}).tolist()
Вывод
[True, True, True]
[True, False, True]

Коды с ведущими нулями

Идентификаторы, индексы и телефоны — не числа. При приведении к int ведущие нули теряются.

id как число
raw["id"].astype(int).tolist()                 # ведущие нули пропали — id лучше оставить строкой
Вывод
[1, 2, 3]

В столбец str нельзя записать число

Число в строковый столбецошибка: TypeError
codes = pd.Series(["A1", "B2"])
codes[0] = 5                                   # в столбец str можно писать только строки
Ошибка
TypeError: Invalid value '5' for dtype 'str'. Value should be a string or missing value, got 'int' instead.