Как получить среднее значение для указанной категории c и вменять категорию пропущенных значений с помощью соответствующей медианы - PullRequest
0 голосов
/ 08 апреля 2020

Привет, у меня есть данные следующим образом:

import pandas as pd
import numpy as np

загрузка данных в фрейм данных

X = pd.read_csv('demo.csv')

интересуют два столбца: столбец Категория и итоги:

Category Totals estimates
A        2777    0.43
B        1003    0.26
D         NA     0.65
D        2638    0.17
B         NA     0.74
C        2196    0.13
D        2630    0.91
A         NA     0.39
C        2472    0.51
B        1090    0.12
C         NA     0.64

Я могу найти медиану категории A как:

df.groupby('Category').Totals.median().loc['A']

Мне нужна помощь для достижения следующего:

  1. Мне нужно найти медиану всех категорий сразу, а не по одной.
  2. Затем мне нужно вменять пропущенные значения в столбце Totals по медиане соответствующей категории.

Помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Вы можете использовать transform с fillna здесь:

df['Totals'] = df.Totals.fillna(df.groupby('Category').Totals.transform('median'))

Или другим способом может быть:

df['Totals'] = (df.set_index('Category').Totals
                  .fillna(df.groupby('Category').Totals.median()).values)

print(df)

   Category  Totals  estimates
0         A  2777.0       0.43
1         B  1003.0       0.26
2         D  2634.0       0.65
3         D  2638.0       0.17
4         B  1046.5       0.74
5         C  2196.0       0.13
6         D  2630.0       0.91
7         A  2777.0       0.39
8         C  2472.0       0.51
9         B  1090.0       0.12
10        C  2334.0       0.64
​
1 голос
/ 08 апреля 2020

Используйте GroupBy.transform с median для Series с тем же размером, что и оригинал, поэтому можно заменить отсутствующие значения на Series.fillna:

df.Totals = df.Totals.fillna(df.groupby('Category').Totals.transform('median'))

Альтернативное решение с лямбда-функцией:

df.Totals = df.groupby('Category').Totals.transform(lambda x: x.fillna(x.median()))

print (df)
   Category  Totals  estimates
0         A  2777.0       0.43
1         B  1003.0       0.26
2         D  2634.0       0.65
3         D  2638.0       0.17
4         B  1046.5       0.74
5         C  2196.0       0.13
6         D  2630.0       0.91
7         A  2777.0       0.39
8         C  2472.0       0.51
9         B  1090.0       0.12
10        C  2334.0       0.64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...