Как заполнить NaN средним значением подгруппы группы? - PullRequest
2 голосов
/ 22 октября 2019

У меня есть фрейм данных с некоторыми значениями year и type. Я хочу заменить все значения NaN в каждом году средним значением этого года конкретным типом. Я хотел бы сделать это самым элегантным способом. Я имею дело с большим количеством данных, поэтому было бы неплохо меньше вычислений.

Пример:

df =pd.DataFrame({'year':[1,1,1,2,2,2],
                  'type':[1,1,2,1,1,2],
             'val':[np.nan,5,10,100,200,np.nan]})

Я хочу, чтобы ВСЕ nan, независимо от их типа, были заменены на соответствующий годсреднее для всех типов 1.

В этом примере первая строка NaN должна быть заменена на 5, а последняя строка должна быть заменена на 150.

Это только заполняет значения, которыеотсутствует для типа 1, а не для типа 2

df[val]=df[val].fillna(df.query('type==1').groupby('year')[val].transform('mean'))

Ответы [ 3 ]

1 голос
/ 22 октября 2019

Использование fillna и соответствующие индексы

df['val'] = (df.set_index('year').val
              .fillna(df.query('type == 1').groupby(['year']).val.mean())
              .values)

  year  type    val
0     1     1    5.0
1     1     1    5.0
2     1     2   10.0
3     2     1  100.0
4     2     1  200.0
5     2     2  150.0
1 голос
/ 22 октября 2019

mask и transform

df.fillna({'val': df.val.mask(df.type.ne(1)).groupby(df.year).transform('mean')})

   year  type    val
0     1     1    5.0
1     1     1    5.0
2     1     2   10.0
3     2     1  100.0
4     2     1  200.0
5     2     2  150.0
1 голос
/ 22 октября 2019

Вы хотите map:

# calculate mean val of type 1 by year
s = df[df['type'].eq(1)].groupby('year')['val'].mean()

# replace `year` by the above mean, and fill in the Nan
df['val'] = df['val'].fillna(df['year'].map(s))

Вывод:

   year  type    val
0     1     1    5.0
1     1     1    5.0
2     1     2   10.0
3     2     1  100.0
4     2     1  200.0
5     2     2  150.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...