Верните данные из предыдущей записи в текущую запись

#python #pandas #dataframe #numpy

Вопрос:

У меня есть следующий фрейм данных:

  account    contract    price   order
0   B   1222    1000    Original
1   B   1225    2000    1st
2   C   1323    500 2nd
3   D   1449    200 Original
4   D   1223    300 1st
5   D   1224    100 2nd
 

Я хочу получить следующий результат:

  account    contract    price   order   prev_contract   prev_price
0   B   1222    1000    Original    NaN NaN
1   B   1225    2000    1st 1222.0  1000.0
2   C   1323    500 2nd 1225.0  2000.0
3   D   1449    200 Original    NaN NaN
4   D   1223    300 1st 1449.0  200.0
5   D   1224    100 2nd 1223.0  300.0
 

На каждой учетной записи может быть один или несколько контрактов. Контракты для каждого аккаунта заказываются с «Оригинального», «1-го», «2-го» и так далее (некоторые могут доходить до 130-го). Я хочу создать столбцы рядом с существующим фреймом данных, чтобы поместить данные/запись из предыдущего контракта на основе заказа.

Ответ №1:

Давайте попробуем shift

 out = df.join(df.groupby(['account'])['price','order'].shift(),rsuffix = '_prev')
  account  contract  price     order  price_prev order_prev
0       B      1222   1000  Original         NaN        NaN
1       B      1225   2000       1st      1000.0   Original
2       C      1323    500       2nd         NaN        NaN
3       D      1449    200  Original         NaN        NaN
4       D      1223    300       1st       200.0   Original
5       D      1224    100       2nd       300.0        1st
 

Ответ №2:

Вы можете попробовать с помощью groupby() , where() , shift() и join() метода:

 grouped=df.groupby('account')

df=df.join(grouped[['contract','price']]
           .transform(lambda x:x.where(grouped['account'].transform('count').gt(1))).shift(1)
           .add_prefix('prev_'))
 

Выход из df :

     account     contract    price   order       prev_contract   prev_price
0   B           1222        1000    Original    NaN             NaN
1   B           1225        2000    1st         1222.0          1000.0
2   C           1323        500     2nd         1225.0          2000.0 
3   D           1449        200     Original    NaN             NaN
4   D           1223        300     1st         1449.0          200.0
5   D           1224        100     2nd         1223.0          300.0