我有一个像这样的Pandas数据框:
groupvar1 groupvar2 time value
1 1 1 5
1 1 2 8
1 1 3 9
1 1 4 12
1 1 5 19
1 2 1 5
1 2 2 8
1 2 3 9
我希望在每个groupvar1
x groupvar2
组合中创建一些自动回归术语,这样我最终会得到:
groupvar1 groupvar2 time value t1 t2 t3
1 1 1 5 5 5 5
1 1 2 8 5 5 5
1 1 3 9 8 5 5
1 1 4 12 9 8 5
1 1 5 19 12 9 8
1 2 1 5 5 5 5
1 2 2 8 5 5 5
1 2 3 9 8 5 5
基本上,我在t1
对象的每个组中创建了三个自回归词t2
,t3
,groupby
。如果结果为NaN
,则从当前值回填。我这样做的代码是:
for name, group in df.groupby(['groupvar1', 'groupvar2']):
for i in range(1, 4):
group.loc[:,'t' + str(i)] = group.sort_values(by=['time'])['value'].shift(i).fillna(method='ffill').fillna(method='bfill').values
问题是在大型数据集上,这非常慢。有没有办法使用可能比这更快的内置Pandas方法?例如,改为使用.apply
?
答案 0 :(得分:1)
您不需要乱搞groupby对象。最后看起来你的条件是groupvar2单元格应该等于groupvar2 cell i元素。这就是你想要的:
import pandas as pd
groupvar1 = pd.Series([1]*8, name='groupvar1')
groupvar2 = pd.Series([1,1,1,1,1,2,2,2], name='groupvar2')
time = pd.Series([1,2,3,4,5,1,2,3], name='time')
value = pd.Series([5,8,9,12,19,5,8,9], name='value')
df = pd.concat([groupvar1, groupvar2, time, value], axis=1)
data = [df]
for i in range(1,4):
temp = df.loc[df['groupvar2'] == df['groupvar2'].shift(-i)]['value']
temp.name = 't' + str(i)
data.append(temp.reindex_like(df).shift(i))
res = pd.concat(data, axis=1).bfill()
print(res)
groupvar1 groupvar2 time value t1 t2 t3
0 1 1 1 5 5.0 5.0 5.0
1 1 1 2 8 5.0 5.0 5.0
2 1 1 3 9 8.0 5.0 5.0
3 1 1 4 12 9.0 8.0 5.0
4 1 1 5 19 12.0 9.0 8.0
5 1 2 1 5 5.0 5.0 NaN
6 1 2 2 8 5.0 5.0 NaN
7 1 2 3 9 8.0 5.0 NaN
虽然你应该仔细检查最后的数据,因为移位的方式是有效的(注意最后一列的末尾有NaN)。