Замена отсутствующих данных на медианные значения групп

Надо: подставить медианные значения каждой группы income_type на место пропусков в столбце total_income.

Есть df по двум колонкам.
total_income    income_type

были найдены медианные значения для каждой уникальной группы data.groupby('income_type')['total_income'].median().round()

В столбце total_income есть отсутствующие значения, которые нужно заменить на медианное значение, для каждой группы.

Мной был выполнен код

    income_type = data['income_type']
    if income_type == 'сотрудник':
        return total_income == 142594.0
    if income_type == 'пенсионер':
        return total_income == 118514.0
    if income_type == 'компаньон':
        return total_income == 172358.0
    if income_type == 'госслужащий':
        return total_income == 150448.0
    if income_type == 'безработный':
        return total_income == 131340.0
    if income_type == 'предприниматель':
        return total_income == 499163.0
    if income_type == 'студент':
        return total_income == 98202.0
    if income_type == 'в декрете':
        return total_income == 53829.0

data['total_income'] = data['total_income'].fillna(total_income_med)

Но, почему-то при проверке типа данных у столбца выдает object.

Не могу понять, что именно я делаю не так. И возможно есть другой метод, который намного проще. Я только вторую неделю изучаю python :)

Ответы (2 шт):

Автор решения: SergFSM

не уверен, что правильно понял, но возможно это вам поможет:

data.groupby('income_type').apply(lambda x: x['total_income'].fillna(x['total_income'].median()))
→ Ссылка
Автор решения: Alexey Trukhanov

По документации, в метод .fillna передается scalar, dict, Series, or DataFrame, но не функция. Когда Вы в метод .fillna передаете функцию, по уму, надо было бы поднимать исключение TypeError, но это вопрос к разработчикам. Сейчас же, получается так, что Ваш код заменяет пропуски на function total_income_med, а не возвращаемым ей значением. Именно поэтому этот столбец датафрейма приобретает тип object.

Первый шаг был верный - делаем серию из медианных значений:

median_series = data.groupby('income_type')['total_income'].median().round()

Мы получили серию, которую можем передать в .fillna, но, предварительно, нам надо поставить в индекс исходного датафрейма значения из столбца income_type. Тогда метод .fillna будет брать индекс исходного датафрейма (то есть название группы) и подставлять значение из сгруппированной серии, в соответствие с этим индексом.

data['total_income'] = data.set_index('income_type')['total_income'].fillna(median_series)
→ Ссылка