Групповой, Сдвиг и Сумма - PullRequest
2 голосов
/ 09 июля 2019

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

product    Week_Number       Sales
1               1              10
2               1              15
1               2              20

И я хотел бы сгруппировать продукт и номер недели и создать столбец с продажами следующей недели для этого продукта:

product    Week_Number       Sales       next_week
1               1              10            20      
2               1              15             0
1               2              20             0

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Используйте DataFrame.sort_values с DataFrameGroupBy.shift:

#if not sure if sorted per 2 columns
df = df.sort_values(['product','Week_Number'])

#pandas 0.24+
df['next_week'] = df.groupby('product')['Sales'].shift(-1, fill_value=0)
#pandas below
#df['next_week'] = df.groupby('product')['Sales'].shift(-1).fillna(0, downcast='int')
print (df)
   product  Week_Number  Sales  next_week
0        1            1     10         20
1        2            1     15          0
2        1            2     20          0

Если возможно, дублирует и требует агрегирования sum сначала в реальных данных:

df = df.groupby(['product','Week_Number'], as_index=False)['Sales'].sum()
df['next_week'] = df.groupby('product')['Sales'].shift(-1).fillna(0, downcast='int')
print (df)
   product  Week_Number  Sales  next_week
0        1            1     10         20
1        1            2     20          0
2        2            1     15          0
0 голосов
/ 09 июля 2019

Сначала отсортируйте данные
Затем примените сдвиг, используя transform

df = pd.DataFrame(data={'product':[1,2,1],
                        'week_number':[1,1,2],
                        'sales':[10,15,20]})
df.sort_values(['product','week_number'],inplace=True)
df['next_week'] = df.groupby(['product'])['sales'].transform(pd.Series.shift,-1,fill_value=0)
print(df)
      product  week_number  sales  next_week
0        1            1     10         20
2        1            2     20          0
1        2            1     15          0
...