Создать столбец на основе вычисления другого столбца - PullRequest
1 голос
/ 27 апреля 2020

Я хотел бы создать еще один столбец на основе продаж за предыдущую неделю. Вот пример ввода:

df = pd.DataFrame({'Week':[1,1,2,2,3,3,4,4,5,5,1,1,2,2,3,3,4,4,5,5],
                   'Category':['Red','White','Red','White','Red','White','Red','White','Red','White','Red','White','Red','White','Red','White','Red','White','Red','White'],
                   'id':[1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2],
                   'Sales':[100,200,300,400,100,200,300,400,100,200,100,200,300,400,100,200,300,400,100,200],
                  'Sales_others':[10,20,30,40,10,20,30,40,10,20,10,20,30,40,10,20,30,40,10,20]})
print(df)

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

    df_output = pd.DataFrame({'Week':[1,1,2,2,3,3,4,4,5,5,1,1,2,2,3,3,4,4,5,5],
                       'Category':['Red','White','Red','White','Red','White','Red','White','Red','White','Red','White','Red','White','Red','White','Red','White','Red','White'],
                       'id':[1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2],
                       'Sales':[100,200,300,400,100,200,300,400,100,200,100,200,300,400,100,200,300,400,100,200],
                      'Sales_others':[10,20,30,40,10,20,30,40,10,20,10,20,30,40,10,20,30,40,10,20],
                      'Sales_previous_week':[0,0,100,200,300,400,100,200,300,400,0,0,100,200,300,400,100,200,300,400]})
print(df_output)

Мне трудно создать то, что было бы самообъединением. Предыдущая неделя должна зависеть только от файла продаж, и я должен иметь возможность сохранить столбец «sales_others»

- Изменить Добавление исходного кода

CR_UK_NL_Weeklevel['PREVIOUS_WEEK'] = CR_UK_NL_Weeklevel.groupby(['RETAIL_SITE_ID','CATEGORY_NAME'])['CURRENT_WEEK'].shift(fill_value=0)
print(CR_UK_NL_Weeklevel)

Переименование столбцов

CR_UK_NL_Weeklevel.columns.values[4] = 'CURRENT_WEEK'
CR_UK_NL_Weeklevel.columns.values[3] = 'LAST_YEAR_WEEK'
CR_UK_NL_Weeklevel.columns.values

Попытка реализовать решение:

CR_UK_NL_Weeklevel['PREVIOUS_WEEK'] = CR_UK_NL_Weeklevel.groupby(['RETAIL_SITE_ID','CATEGORY_NAME'])['CURRENT_WEEK'].shift(fill_value=0)
print(CR_UK_NL_Weeklevel)

[78]:

CR_UK_NL_Weeklevel['PREVIOUS_WEEK'] = CR_UK_NL_Weeklevel.groupby(['RETAIL_SITE_ID','CATEGORY_NAME'])['CURRENT_WEEK'].shift(fill_value=0)
print(CR_UK_NL_Weeklevel)

- Ошибка

------- -------------------------------------------------- ------------------ KeyError Traceback (последний вызов был последним) в ----> 1 CR_UK_NL_Weeklevel ['PREVIOUS_WEEK'] = CR_UK_NL_Weeklevel.groupby (['RETAIL_SITE_ID', ' CATEGORY_NAME ']) [' CURRENT_WEEK ']. Shift (fill_value = 0) 2 печати (CR_UK_NL_Weeklevel) ~ \ AppData \ Local \ Continuum \ anaconda3 \ lib \ site-packages \ pandas \ core \ base.py в getitem (self, key) 273 else: 274, если ключ отсутствует в self.obj: -> 275 повысить KeyError («Столбец не найден: {key}». Format (key = key)) 276 вернуть self._gotitem (key , ndim = 1) 277 KeyError: 'Столбец не найден: CURRENT_WEEK'

1 Ответ

2 голосов
/ 27 апреля 2020

Если в неделю и в последующие недели всегда есть одни и те же категории, используйте DataFrameGroupBy.shift группирование по столбцу Category:

df['Sales_PREVIOUS'] = df.groupby('Category')['Sales'].shift(fill_value=0)
print (df)
   Week Category  Sales  Sales_PREVIOUS
0     1      Red    100               0
1     1    White    200               0
2     2      Red    300             100
3     2    White    400             200
4     3      Red    100             300
5     3    White    200             400
6     4      Red    300             100
7     4    White    400             200
8     5      Red    100             300
9     5    White    200             400

Другая идея с поворотом - использование DataFrame.pivot, затем DataFrame.shift с DataFrame.stack для Series и последнее добавление нового столбца на DataFrame.join:

s = df.pivot('Week','Category','Sales').shift(fill_value=0).stack()
df = df.join(s.rename('Sales_PREVIOUS WEEK'), on=['Week','Category'])

РЕДАКТИРОВАТЬ:

С новыми данными добавить столбец id:

df['Sales_PREVIOUS'] = df.groupby(['id','Category'])['Sales'].shift(fill_value=0)

И для второго решения:

s = df.set_index(['Week','id','Category'])['Sales'].unstack([1,2]).shift(fill_value=0).unstack()
df = df.join(s.rename('Sales_PREVIOUS WEEK'), on=['id','Category','Week'])
print (df)
    Week Category  id  Sales  Sales_others  Sales_PREVIOUS WEEK
0      1      Red   1    100            10                    0
1      1    White   1    200            20                    0
2      2      Red   1    300            30                  100
3      2    White   1    400            40                  200
4      3      Red   1    100            10                  300
5      3    White   1    200            20                  400
6      4      Red   1    300            30                  100
7      4    White   1    400            40                  200
8      5      Red   1    100            10                  300
9      5    White   1    200            20                  400
10     1      Red   2    100            10                    0
11     1    White   2    200            20                    0
12     2      Red   2    300            30                  100
13     2    White   2    400            40                  200
14     3      Red   2    100            10                  300
15     3    White   2    200            20                  400
16     4      Red   2    300            30                  100
17     4    White   2    400            40                  200
18     5      Red   2    100            10                  300
19     5    White   2    200            20                  400

РЕДАКТИРОВАТЬ:

Проблема с именами столбцов, используйте:

cols = CR_UK_NL_Weeklevel.columns.tolist()
cols[4] = 'CURRENT_WEEK'
cols[3] = 'LAST_YEAR_WEEK'
CR_UK_NL_Weeklevel.columns = cols
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...