Сдвиг столбца на число из другого столбца в кадре данных - PullRequest
0 голосов
/ 25 июня 2018

У меня есть фрейм данных, который выглядит следующим образом:

    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 голосов
/ 25 июня 2018

На самом деле вы можете просто reindex, вычитая значения look_back_period из индекса:

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

Мы должны преобразовать в массив numpy, используя .values, потому что без этого вы получите ValueError: cannot reindex from a duplicate axisошибка

0 голосов
/ 25 июня 2018

Вот одно решение, использующее понимание списка с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...