NaN: разные стратегии для разных колонок
// Условие
Таблица df — данные о пользователях с искусственно введёнными пропусками.
Что нужно
Заполни NaN в трёх колонках разными стратегиями:
city— заполни строкой'unknown';age— заполни медианой по непустым значениям (округлить до int);signup_date— ничего не трогай, оставь NaN как есть;revenue— заполни средним по непустым значениям (округлить до 2 знаков).
// Данные
df:
user_id (без NaN), city (~10% NaN), age (~8% NaN), signup_date (~3% NaN), revenue (~12% NaN)// Решение
Подсказка
Для категориальной колонки: df['city'].fillna('unknown').
Медиана по непустым: df['age'].median() — skipna=True по умолчанию. После fillna приведи к int: .astype(int).
Среднее: df['revenue'].mean(). Округли: round(..., 2) и передай в fillna. signup_date не трогай — просто не пиши для неё строку fillna.
Сначала попробуй сам → Показать решение
df = load_data()
result = df.copy()
result['city'] = result['city'].fillna('unknown')
result['age'] = result['age'].fillna(df['age'].median()).astype(int)
result['revenue'] = result['revenue'].fillna(round(df['revenue'].mean(), 2))
# signup_date — не трогаем
print(result.head())
print(f"NaN после:\n{result.isna().sum()}")
Разные колонки — разные стратегии. Для категории —
fillna('unknown') (или модальное значение). Для числовой — медиана устойчивее к выбросам; среднее — когда распределение нормальное. Для дат — обычно оставляют NaN (или дропают строки, если дата критична для анализа). Не делай df.fillna(0) глобально — это типичная ошибка джуна.