假设我有一个10行的数据框,其中有两列A和B,如下所示:
A B
0 21 6
1 87 0
2 87 0
3 25 0
4 25 0
5 14 0
6 79 0
7 70 0
8 54 0
9 35 0
在Excel中,我可以这样计算
rolling
mean
,不包括第一行:我怎样才能在熊猫身上做到这一点?
以下是我尝试过的:
import pandas as pd
df = pd.read_clipboard() #copying the dataframe given above and calling read_clipboard will get the df populated
for i in range(1, len(df)):
df.loc[i, 'B'] = df[['A', 'B']].loc[i-1].mean()
这给了我与Excel匹配的期望结果。但是熊猫有更好的方法吗?我试过使用
expanding
和rolling
并没有产生理想的结果。 最佳答案
你有一个指数加权的移动平均数,而不是一个简单的移动平均数。这就是为什么pd.DataFrame.rolling
不起作用的原因。你可能要找的是pd.DataFrame.ewm
。
从
df
Out[399]:
A B
0 21 6
1 87 0
2 87 0
3 25 0
4 25 0
5 14 0
6 79 0
7 70 0
8 54 0
9 35 0
df['B'] = df["A"].shift().fillna(df["B"]).ewm(com=1, adjust=False).mean()
df
Out[401]:
A B
0 21 6.000000
1 87 13.500000
2 87 50.250000
3 25 68.625000
4 25 46.812500
5 14 35.906250
6 79 24.953125
7 70 51.976562
8 54 60.988281
9 35 57.494141
即使在只有10行的情况下,这样做也会使代码的速度提高约10倍,
%timeit
(从10.3ms到959微秒)。在100行上,这将成为100的因子(1.1毫秒对110毫秒)。