python-3.x - 如何在 pandas 中生成更快的滑动窗口功能?
问题描述
我有一个数据集,如:
Region Product Date Order
North A 1/1/2019 10
North A 1/2/2019 11
....
North A 1/29/2019 1
North A 1/30/2019 150
我正在使用循环创建滞后功能(以前的日期顺序):
temp_df = pd.DataFrame()
for k in df['Region'].unique():
temp_df2 = df[df['Region']==k]
for j in temp_df2['Product'].unique():
temp_df3 = temp_df2[temp_df2['Product']==j]
for i in range(28,56):
temp_df3['lag_{}'.format(-i)] = temp_df3['Order'].shift(i).fillna(0)
temp_df = temp_df.append(temp_df3)
运行这个嵌套循环的时间很长。如何更快地预处理数据?提前致谢!
预期输出:
Region Product Date Order Lag_28 Lag_29
North A 1/1/2019 10 N/A N/A
....
North A 1/30/2019 150 11 10
解决方案
使用groupby
会更快(更清洁):
groups = df.groupby(['Region', 'Product'])['Order']
for i in range(28,56):
df[f'Lag_{i}'] = groups.shift(i)
推荐阅读
- c++ - 如何在 QGridLayout 中获取 QComboBox 的当前文本?
- azure-devops - Azure DevOps NuGet 源仅缓存来自上游源的第一个版本
- sql - 查询 TFS 以显示所有版本以及是否设置为批准。五、2017.3
- angular - 重置从父组件调用的子角度组件,它是模态窗口
- javafx - 如何在 Groovyfx 中迭代地图?不断出错!我该如何解决这个问题
- c++ - “符号查找错误:”从不同目录执行时,否则从构建目录执行时按预期工作
- c# - 为什么在任务运行时添加 Console.CancelKeyPress 处理程序会阻止调试器 CTRL+C 退出
- sql - MS SQL 将数据转置到下一列,max.transposed items = 5
- java - 如何在 VS Code 中隐藏 .class 文件?
- firebase - Vue.js:如何保护登录组件免受经过身份验证的用户的影响