#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)