Замена отсутствующих данных на медианные значения групп
Надо: подставить медианные значения каждой группы income_type на место пропусков в столбце total_income.
были найдены медианные значения для каждой уникальной группы
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 шт):
не уверен, что правильно понял, но возможно это вам поможет:
data.groupby('income_type').apply(lambda x: x['total_income'].fillna(x['total_income'].median()))
По документации, в метод .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)
