to_numeric с errors='coerce' + диагностика
// Условие
Колонка amount_raw пришла из CSV как строка. Часть значений — нормальные числа, часть — мусор: 'N/A', '-', пустые строки, и числа в европейском формате с запятой (например '1234,56').
Что нужно
Приведи amount_raw к числовому типу и посчитай потери. Верни dict (не DataFrame) с ключами:
clean_count(int) — сколько строк успешно сконвертировалось;coerced_nan(int) — сколько превратилось в NaN;total_amount(float) — сумма по успешно сконвертированным (округлить до 2 знаков).
// Данные
df:
order_id, amount_raw (string — числа + мусор + европейский формат с запятой)// Решение
Подсказка
Сначала почисти формат: df['amount_raw'].str.replace(',', '.', regex=False) — это превратит '1234,56' в '1234.56'.
Потом: pd.to_numeric(..., errors='coerce') — мусор превратится в NaN вместо исключения. astype(float) упадёт на первой плохой строке.
Считай метрики: amount.notna().sum(), amount.isna().sum(), amount.sum(). Верни dict с тремя ключами.
Сначала попробуй сам → Показать решение
df = load_data()
# 1) европейский формат: запятая → точка
amount = df['amount_raw'].str.replace(',', '.', regex=False)
# 2) безопасная конвертация
amount = pd.to_numeric(amount, errors='coerce')
clean_count = int(amount.notna().sum())
coerced_nan = int(amount.isna().sum())
total_amount = round(float(amount.sum()), 2)
result = {
'clean_count': clean_count,
'coerced_nan': coerced_nan,
'total_amount': total_amount,
}
print(result)
errors='coerce' — безопасный способ привести колонку к числу (вместо astype(float), которая упадёт на первой плохой строке). Всегда диагностируй сколько NaN получилось — если 50% «coerced», что-то не так с данными ИЛИ с подходом. Альтернатива для европейского формата: pd.read_csv(..., decimal=',') уже на этапе чтения.