1

我的数据框如下所示:

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() 但我总是想包含所有数据点而不排除第一个数据点。

4

2 回答 2

6

使用Series.expandingwith mean,然后在必要时设置NaN为第一个值:

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
于 2020-10-12T10:23:44.843 回答
1

这只是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

要将第一个单元格设为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)
于 2020-10-12T10:31:01.507 回答