我有一个如下所示的数据框:
Sales Look_back_period
0 100 1
1 102 1
2 103 2
3 108 2
4 100 3
5 90 4
6 97 6
The output I want:
Sales Look_back_period lag_sales
0 100 1 NaN
1 102 1 100
2 103 2 100
3 108 2 102
4 100 3 102
5 90 4 102
6 97 6 100
我想根据Look_back_period
改变销售价值。
我正在做的是:
df[‘lag_sales’] = df.Sales.shift(df.look_back_period)
但它不起作用。
答案 0 :(得分:5)
实际上,您可以通过从索引中减去look_back_period值来reindex
:
In[18]:
df['Look_back_period'] = df['Sales'].reindex(df.index - df['Look_back_period']).values
df
Out[18]:
Sales Look_back_period lag_sales
0 100 NaN NaN
1 102 100.0 100.0
2 103 100.0 100.0
3 108 102.0 102.0
4 100 102.0 102.0
5 90 102.0 102.0
6 97 100.0 100.0
我们必须使用.values
转换为numpy数组,因为如果不这样做,则会出现ValueError: cannot reindex from a duplicate axis
错误
答案 1 :(得分:2)
这里是使用列表理解和enumerate
的一种解决方案:
df = pd.DataFrame.from_dict({'Look_back_period': {0: 1, 1: 1, 2: 2, 3: 2, 4: 3, 5: 4, 6: 6},
'Sales': {0: 100, 1: 102, 2: 103, 3: 108, 4: 100, 5: 90, 6: 97}})
df['lage_sales'] = [np.nan] + [df['Sales'].iat[i-j] for i, j in \
enumerate(df['Look_back_period'].iloc[1:], 1)]
print(df)
Sales Look_back_period lage_sales
0 100 1 NaN
1 102 1 100.0
2 103 2 100.0
3 108 2 102.0
4 100 3 102.0
5 90 4 102.0
6 97 6 100.0