我有一个数据帧 df
:
df = pd.DataFrame({'id1':[1,1,1,1,1,4,4,4,6,6],
'id2':[45,45,33,33,33,1,1,1,34,34],
'vals':[0.1,0.2,0.6,0.1,0.15,0.34,0.12,0.5,0.4,0.45],
'date':pd.to_datetime(['2017-01-01','2017-01-02','2017-01-01',
'2017-04-01','2017-04-02','2017-01-01',
'2017-01-02','2017-01-03','2017-01-04',
'2017-01-05'])})
我想根据时间为每个id1
和id2
组创建滞后项。例如,t_1
是前一天的值。t_2
将是两天前的值。如果没有两天前的值,我希望它是nan
。这将是上述数据框的输出:
date id1 id2 vals t_1 t_2
0 2017-01-01 1 33 0.60 NaN NaN
1 2017-04-01 1 33 0.10 NaN NaN
2 2017-04-02 1 33 0.15 0.10 NaN
0 2017-01-01 1 45 0.10 NaN NaN
1 2017-01-02 1 45 0.20 0.10 NaN
0 2017-01-01 4 1 0.34 NaN NaN
1 2017-01-02 4 1 0.12 0.34 NaN
2 2017-01-03 4 1 0.50 0.12 0.34
0 2017-01-04 6 34 0.40 NaN NaN
1 2017-01-05 6 34 0.45 0.40 NaN
我可以使用下面的代码来实现这个功能,但对于大量组合非常低效 - 即如果我有10000 x 500个唯一的 id1
和 id2
组合,每个组合都有数天的数据,并且我想要两个滞后项,那么它需要很长时间。
num_of_lags = 2
for i in range(1, num_of_lags+1):
final = pd.DataFrame()
for name, group in df.groupby(['id1', 'id2']):
temp = group.set_index('date', verify_integrity=False)
temp = temp.shift(i, 'D').rename(columns={'vals':'t_' + str(i)}).reset_index()
group = pd.merge(group, temp[['id1', 'id2', 'date', 't_' + str(i)]],
on=['id1', 'id2', 'date'], how='left')
final = pd.concat([final, group], axis=0)
df = final.copy()
有更有效的方法来做这件事吗?
id1
和id2
有关系呢?看起来你只是在使用vals
。 - Brad Solomonid1
和id2
有关 - 我正在通过这些分组,所以我只想在每个唯一的id1
和id2
组合内使用滞后变量。因此,我不能对整个数据框执行.shift(1, freq = 'D')
。 - user1566200