Заполнение таблицы разными медианами

Дано две таблицы. Одна эта датафрейм, вторая с медианами зарплат в зависимости от занятости.

  **занятость**   **медиана зарплат**

0   безработный     131339.751676
1   в декрете       53829.130729
2   госслужащий     150447.935283
3   компаньон       172357.950966
4   пенсионер       118514.486412
5   предприниматель 499163.144947
6   сотрудник       142594.396847
7   студент         98201.625314

Как заполнить пропуски в датафрейме разными медианами. Тесть если есть пропуск в зарплате пенсонера в датафрейме, то он заполнился именно медианой которая ему соответствует.

Исходные данные имеют вид:

введите сюда описание изображения

Я придумал условие которое можно вручную сделать по каждому пункту, но как сохранить изменения пока не придумал. Тоесть после всех условий исходный df не меняется и есть все равно пропуски.

df[df['income_type'] == 'сотрудник'] ['total_income'].fillna(142594.396847)

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

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

Нужно просто продумать по шагам действия

  • делаем фильтр интересующих нас записей с NA в доходе
  • заполняем их, соединяя с датафреймом с медианным доходом
df_mask = df['total_income'].isna()
df.loc[df_mask, 'total_income'] = \
    df.loc[df_mask, ['сотрудник']].join(df_median, on='сотрудник')['median_income']

Код приблизительный, но должно работать. Вы в своём коде никуда результат не присваиваете, поэтому он не запоминается.

→ Ссылка
Автор решения: VANjKE

Кто там про воспроизводимый пример пишет, я не знаю что это такое. Первый вариант.
Набросали мне такой код в цикле можно сделать!

for income_item in df['income_type'].unique():
for education_item in df['education'].unique():

    median_value = df[(df['income_type'] == income_item) & (df['education'] == education_item)]['total_income'].median()

    df.loc[(df['income_type'] == income_item) & (df['education'] == education_item), 'total_income'] = df.loc[(df['income_type'] == income_item) & (df['education'] == education_item), 'total_income'].fillna(median_value)

Второй вариант через групировку по условию/условиям и фунуцию transform()

median_table = df.groupby('income_type')['total_income'].transform('median')

А позже передать эту таблицу для заполнения пропусков.

df['total_income'] = df['total_income'].fillna(median_table)
→ Ссылка