使用Pandas 1.0和Numpy 1.18,我需要对具有大量组的大型数据框应用具有不同窗口大小和汇总功能的Rolling多次。在应用汇总功能之前,系列还会移位1以丢弃当前行值。这是滚动最大值偏移1的示例:
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': [5,2,4,5,4,2,3,5,5,2,4,1], 'b': [18,37,60,45,40,40,50,10,30,2,46,19]})
df = df.sort_values('a').reset_index(drop=True)
df['max'] = df.groupby('a', sort=False, as_index=False)['b'].rolling(2, min_periods=1).apply(lambda x: np.max(x[:-1])).reset_index(drop=True)
结果:
df
a b max
0 1 19 NaN
1 2 37 NaN
2 2 40 37.0
3 2 2 40.0
4 3 50 NaN
5 4 60 NaN
6 4 40 60.0
7 4 46 40.0
8 5 18 NaN
9 5 45 18.0
10 5 10 45.0
11 5 30 10.0
结果是正确的,但是一旦应用于大型数据框,它会花费很长时间,我想知道是否有一种方法可以重构此逻辑以利用 vectorization 而不是依赖apply
,据我所读,是作为幕后的循环实现的,效果不佳。