Среднее значение столбца по всем предыдущим значениям

#python #pandas

#python #панды

Вопрос:

мой фрейм данных выглядит следующим образом:

 Time            Amount
2020-01-01      63
2020-01-02      200
2020-01-03      342
2020-01-04      91
2020-01-05      500
2020-01-06      200
  

Что я хотел бы сделать, так это вычислить среднее значение для каждой строки, включая суммы всех приведенных выше строк.

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

 Time            Amount    Average
2020-01-01      63        NaN
2020-01-02      200       131.5
2020-01-03      342       201.67
2020-01-04      91        174
2020-01-05      500       239.2
2020-01-06      200       232.67
  

Я думал об использовании .rolling().mean() но я всегда хочу включать все точки данных и не исключать первую.

Ответ №1:

Используйте Series.expanding с mean , а затем при необходимости установите NaN значение first:

 df['new'] = df['Amount'].expanding().mean()
df.loc[0, 'new'] = np.nan
print (df)
         Time  Amount         new
0  2020-01-01      63         NaN
1  2020-01-02     200  131.500000
2  2020-01-03     342  201.666667
3  2020-01-04      91  174.000000
4  2020-01-05     500  239.200000
5  2020-01-06     200  232.666667
  

Ответ №2:

Это просто cummean . Вы можете реализовать cummean с помощью простого вычисления как

 df.Amount.cumsum() / np.arange(1, df.shape[0] 1)

Out[766]:
0     63.000000
1    131.500000
2    201.666667
3    174.000000
4    239.200000
5    232.666667
Name: Amount, dtype: float64
  

Чтобы сделать первую ячейку as NaN , нет другого более простого способа, чем прямое назначение, как в @jezrael .


Сроки: необработанное тестирование показывает, что оно в ~ 3 раза быстрее, чем expanding.mean

 In [774]: df = pd.concat([df]*10000, ignore_index=True)

In [775]: %timeit df['Amount'].expanding().mean()
970 µs ± 1.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [776]: %timeit df.Amount.cumsum() / np.arange(1, df.shape[0] 1)
330 µs ± 1.22 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)