加速在熊猫中创建自回归条款?

时间:2016-12-12 15:48:11

标签: python performance pandas optimization dataframe

我有一个像这样的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对象的每个组中创建了三个自回归词t2t3groupby。如果结果为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

1 个答案:

答案 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)。