3 回答
TA贡献1829条经验 获得超7个赞
可以使用rolling.sum2 的窗口大小:
(df.diff()/df.rolling(2).sum()).eval('abs(Quantity/Price)')
0 NaN
1 8.0
dtype: float64
TA贡献1818条经验 获得超11个赞
基本上你已经有了diff然后你已经有两排sum
由于diff: x[2]-x[1] Then 'sum' : x[2]+x[1]=x[2]*2-(x[2]-x[1])
在您的情况下,总和可以通过以下方式计算
df*2-df.diff()
Out[714]:
Price Quantity
0 NaN NaN
1 96.0 9.0
所以输出是
(df.diff()/(df*2-df.diff())).eval('abs(Quantity/Price)')
Out[718]:
0 NaN
1 8.0
dtype: float64
TA贡献1804条经验 获得超8个赞
对于小数据帧,使用.eval()
效率不高。
以下在某些100.000
行上速度更快:
df = (df.diff() / df.rolling(2).sum()).div(2)
df['result'] = abs(df.Quantity / df.Price)
32.9 ms ± 1.05 ms
每个循环(mean ± std. dev. of 7 runs, 10 loops each)
与 39.6 ms ± 931 µs
每个循环(mean ± std. dev. of 7 runs, 10 loops each)
添加回答
举报