用熊猫移位方法创建滞后值是否有问题?

时间:2019-06-26 11:27:18

标签: python pandas

我想为数据创建滞后值。我正在使用for循环,因为我必须包含大约100个滞后值。但是问题是熊猫方法“ shift”在创建一个滞后值后抛出错误。

例如,当我使用

data1['lag_1']=data1.shift(1)

它正在为一个滞后值生成列。

但是,对于下一个滞后值运行相同的代码时,则会引发错误。

data1['lag_2']=data1.shift(2)

我想在for循环中执行此操作,因为我想创建100个滞后值列,但是这种转换似乎不起作用。


Traceback (most recent call last):

  File "<ipython-input-93-bc545991b12c>", line 1, in <module>
    data1['lag_2']=data1.shift(2)

  File "C:\Users\k0932146\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3370, in __setitem__
    self._set_item(key, value)

  File "C:\Users\k0932146\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3446, in _set_item
    NDFrame._set_item(self, key, value)

  File "C:\Users\k0932146\Anaconda3\lib\site-packages\pandas\core\generic.py", line 3172, in _set_item
    self._data.set(key, value)

  File "C:\Users\k0932146\Anaconda3\lib\site-packages\pandas\core\internals\managers.py", line 1056, in set
    self.insert(len(self.items), item, value)

  File "C:\Users\k0932146\Anaconda3\lib\site-packages\pandas\core\internals\managers.py", line 1158, in insert
    placement=slice(loc, loc + 1))

  File "C:\Users\k0932146\Anaconda3\lib\site-packages\pandas\core\internals\blocks.py", line 3095, in make_block
    return klass(values, ndim=ndim, placement=placement)

  File "C:\Users\k0932146\Anaconda3\lib\site-packages\pandas\core\internals\blocks.py", line 87, in __init__
    '{mgr}'.format(val=len(self.values), mgr=len(self.mgr_locs)))

ValueError: Wrong number of items passed 2, placement implies 1

我也想为100个滞后值实现它,是否有任何有效的方法来创建这些滞后值?

2 个答案:

答案 0 :(得分:0)

这里的问题是数据框中的列数。

最初,您的数据框中只有一列,因此shift只需要数据框中存在一列。

data1 = pd.DataFrame(np.arange(10))
data1['lag_1']=data1.shift(1)
print(data1)

输出:

    0   lag_1
0   0   NaN
1   1   0.0
2   2   1.0
3   3   2.0
4   4   3.0
5   5   4.0
6   6   5.0
7   7   6.0
8   8   7.0
9   9   8.0

现在您的数据框有2列,但是shift仅可应用于单列,因此会引发错误。

在列上应用shift

data1['lag_2']=data1[0].shift(2)

输出:

    0   lag_1   lag_2
0   0   NaN     NaN
1   1   0.0     NaN
2   2   1.0     0.0
3   3   2.0     1.0
4   4   3.0     2.0
5   5   4.0     3.0
6   6   5.0     4.0
7   7   6.0     5.0
8   8   7.0     6.0
9   9   8.0     7.0

修改

对于100个滞后值,您可以执行以下操作:

for i in range(100):
  col = "lag_{}".format(i+1)
  data1[col] = data1[0].shift(i+1)

答案 1 :(得分:0)

假设原始data1数据帧只有一列。所以当你写:

data1['lag_1']=data1.shift(1)

您正在将单列数据帧分配到新列中,这很好。

但是写第二遍时:

data1['lag_2']=data1.shift(2)

您现在将2列数据帧分配给不再有意义的单列。您应该这样做:

data1['lag_2']=data1.iloc[:,0].shift(2)

以便仅移动和复制第一列。