将一列从数据框中的另一列移一个数字

时间:2018-06-25 11:13:18

标签: python python-3.x pandas dataframe

我有一个如下所示的数据框:

    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)

但它不起作用。

2 个答案:

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