Панды группового среднего скользящего / медиана с пропуском пропущенных значений - PullRequest
1 голос
/ 03 июля 2019

Как получить в pandas groupby среднее значение / медиану с пропуском пропущенных значений?Т.е. выходные данные должны отбрасывать пропущенные значения перед вычислением среднего значения / медианы вместо того, чтобы давать мне NaN, если отсутствует пропущенное значение.

import pandas as pd
t = pd.DataFrame(data={v.date:[0,0,0,0,1,1,1,1,2,2,2,2],
                         'i0':[0,1,2,3,0,1,2,3,0,1,2,3],
                         'i1':['A']*12,
                         'x':[10.,20.,30.,np.nan,np.nan,21.,np.nan,41.,np.nan,np.nan,32.,42.]})
t.set_index([v.date,'i0','i1'], inplace=True)
t.sort_index(inplace=True)

print(t)
print(t.groupby('date').apply(lambda x: x.rolling(window=2).mean()))

дает

               x
date i0 i1      
0    0  A   10.0
     1  A   20.0
     2  A   30.0
     3  A    NaN
1    0  A    NaN
     1  A   21.0
     2  A    NaN
     3  A   41.0
2    0  A    NaN
     1  A    NaN
     2  A   32.0
     3  A   42.0

               x
date i0 i1      
0    0  A    NaN
     1  A   15.0
     2  A   25.0
     3  A    NaN
1    0  A    NaN
     1  A    NaN
     2  A    NaN
     3  A    NaN
2    0  A    NaN
     1  A    NaN
     2  A    NaN
     3  A   37.0

, в то время как я хочу следующее для этогопример:

               x
date i0 i1      
0    0  A   10.0
     1  A   15.0
     2  A   25.0
     3  A   30.0
1    0  A    NaN
     1  A   21.0
     2  A   21.0
     3  A   41.0
2    0  A    NaN
     1  A    NaN
     2  A   32.0
     3  A   37.0

то, что я пытался

t.groupby('date').apply(lambda x: x.rolling(window=2).dropna().median())

и

t.groupby('date').apply(lambda x: x.rolling(window=2).median(dropna=True))

(оба вызывают исключения, но, возможно, что-то существует по строкам)

Спасибо за вашу помощь!

1 Ответ

4 голосов
/ 03 июля 2019

Вы ищете min_periods?Обратите внимание, что вам не нужно apply, звоните GroupBy.Rolling напрямую:

t.groupby('date', group_keys=False).rolling(window=2, min_periods=1).mean()
               x
date i0 i1      
0    0  A   10.0
     1  A   15.0
     2  A   25.0
     3  A   30.0
1    0  A    NaN
     1  A   21.0
     2  A   21.0
     3  A   41.0
2    0  A    NaN
     1  A    NaN
     2  A   32.0
     3  A   37.0
...