Числа в маскировке
Человек видит 42 и почти автоматически думает о числе. В CSV это всего лишь последовательность символов, пока библиотека не решит, каким типом её считать. Достаточно одной записи unknown, чтобы весь столбец оказался текстовым.
Для аккуратного файла можно использовать жёсткое преобразование вроде astype(int). В грязных данных оно часто останавливается на первой неподходящей записи. Поэтому полезен более диагностический подход:
df["power"] = pd.to_numeric(
df["power"],
errors="coerce"
)
Понятные числа станут числами, а то, что преобразовать нельзя, превратится в NaN. После этого пропусков может стать больше. Это не обязательно означает, что данные испортились: наоборот, скрытая проблема наконец стала видимой.
Формат числа тоже бывает частью проблемы
Стоимость 10,000,000 может храниться строкой только из-за разделителей тысяч. Тогда сначала убирают оформление, а уже потом меняют тип.
cost = (
df["costume_cost"]
.astype("string")
.str.replace(",", "", regex=False)
)
df["costume_cost"] = pd.to_numeric(
cost,
errors="coerce"
)
Правильный тип ещё не гарантирует правильный смысл
Самые неприятные ошибки вообще не связаны с типами. Представьте столбец расстояний: большинство значений лежит от 1 до 15, а из одного источника регулярно приходят 2500–9000. Все записи числовые, поэтому pandas спокойно посчитает среднее. Но если одна система присылала метры, а остальные — километры, математически корректный расчёт окажется бессмысленным.
print(
df.groupby("source_system")["distance_km"]
.describe()
)
Такие значения нельзя исправлять только по принципу «слишком большие». Нужно предметное основание: описание столбца, документация источника или отчётливая закономерность в способе сбора. Иначе деление на 1000 будет просто красивой догадкой.