Коротко
- Основные типы:
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
typed = raw.astype({"qty": "int64"})
typed.dtypesВывод
id str price str qty int64 vip str dtype: object
pd.to_numeric(raw["price"], errors="coerce") # «нет» → NaN вместо ошибкиВывод
0 120.5 1 95.0 2 NaN Name: price, dtype: float64
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
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 падает на первом плохом значении
raw["price"].astype(float)Ошибка
ValueError: could not convert string to float: 'нет'
astype(bool) для строк
Любая непустая строка — True, включая "False". Переводите через словарь.
print(raw["vip"].astype(bool).tolist()) # непустая строка — всегда True
raw["vip"].map({"True": True, "False": False}).tolist()Вывод
[True, True, True] [True, False, True]
Коды с ведущими нулями
Идентификаторы, индексы и телефоны — не числа. При приведении к int ведущие нули теряются.
raw["id"].astype(int).tolist() # ведущие нули пропали — id лучше оставить строкойВывод
[1, 2, 3]
В столбец str нельзя записать число
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.