#python #pandas
#python #pandas
Вопрос:
У меня есть DF следующим образом:
месяц | shop_id | item_id | продажи |
---|---|---|---|
1 | 0 | 19 | 1 |
1 | 0 | 27 | 1 |
2 | 1 | 19 | 2 |
2 | 1 | 27 | 2 |
Я хочу использовать shift()
так, чтобы новый столбец представлял собой комбинацию shop_id
и item_id
из предыдущего месяца. Это желаемый результат:
месяц | shop_id | item_id | продажи | last_month_sale |
---|---|---|---|---|
1 | 0 | 19 | 1 | NaN |
1 | 0 | 27 | 1 | NaN |
2 | 1 | 19 | 2 | 1 |
2 | 1 | 27 | 2 | 1 |
Все руководства, которые я вижу, просто сдвигаются по строкам, а не на основе какого-либо столбца. Как я могу это сделать?
Комментарии:
1.
df.groupby(['shop_id','item_id'])['sales'].shift()
Ответ №1:
Сначала измените значения на DataFrame.pivot
, сдвиньте, измените обратно и добавьте новый столбец к исходному на DataFrame.join
:
s = df.pivot(['month','shop_id'],'item_id', 'sales').shift().stack().rename('last_month_sale')
df = df.join(s, on=['month','shop_id','item_id'])
print (df)
month shop_id item_id sales last_month_sale
0 1 0 19 1 NaN
1 1 0 27 1 NaN
2 2 1 19 2 1.0
3 2 1 27 2 1.0
Ответ №2:
Попробуйте что-то новое drop_duplicates
с reindex
df['new'] = df.drop_duplicates(['month','shop_id']).sales.shift().reindex(df.index,method = 'ffill')
Out[31]:
0 NaN
1 NaN
2 1.0
3 1.0
Name: sales, dtype: float64