在 Pandas 中為大型數據幀(1500682 行)調用 groupby 以及滾動和應用函數時,我的性能非常緩慢。我正在嘗試獲得具有不同權重的滾動移動平均線。運行緩慢的代碼部分是:df['rolling'] = df.groupby('i2')['x'].rolling(3).apply(lambda x: x[-3]*0.1+x[-2]*0.9).reset_index(level=0, drop=True).reindex(df.index)完整的代碼(帶有數據)是:import pandas as pdfrom random import randint# data (it takes some time to create [less than 1 minute in my computer])data1 = [[[[randint(0, 100) for i in range(randint(1, 2))] for i in range(randint(1, 3))] for i in range(5000)] for i in range(100)]data2 = pd.DataFrame( [ (i1, i2, i3, i4, x4) for (i1, x1) in enumerate(data1) for (i2, x2) in enumerate(x1) for (i3, x3) in enumerate(x2) for (i4, x4) in enumerate(x3) ], columns = ['i1', 'i2', 'i3', 'i4', 'x'])data2.drop(['i3', 'i4'], axis=1, inplace = True)df = data2.set_index(['i1', 'i2']).sort_index()## conflicting part of the code ##df['rolling'] = df.groupby('i2')['x'].rolling(3).apply(lambda x: x[-3]*0.1+x[-2]*0.9).reset_index(level=0, drop=True).reindex(df.index)如果您能詳細說明代碼以使其更高效并更快地執行,我將不勝感激。
1 回答

牧羊人nacy
TA貢獻1862條經驗 獲得超7個贊
如果我理解正確,您可以嘗試:
grp=df.groupby('i2')['x'] df['rolling']=grp.shift(2).mul(0.1).add(grp.shift(1).mul(0.9))
現在詳細說明:
為什么不.apply(...)
:
我什么時候應該在我的代碼中使用 pandas apply()?
你應該做的是使用任何利用矢量化操作的東西。我在這里做了一些更詳細的解釋:
https://stackoverflow.com/a/60029108/11610186
添加回答
舉報
0/150
提交
取消