#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