猿问

基于另一列的计算创建一列

我想根据前一周的销售额创建另一个列。这是示例输入:


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”列


--Edit 添加原始代码


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)




繁花不似锦
浏览 92回答 1
1回答

牧羊人nacy

如果每周总是有相同的类别并且连续几周使用按列DataFrameGroupBy.shift分组:Categorydf['Sales_PREVIOUS'] = df.groupby('Category')['Sales'].shift(fill_value=0)print (df)   Week Category  Sales  Sales_PREVIOUS0     1      Red    100               01     1    White    200               02     2      Red    300             1003     2    White    400             2004     3      Red    100             3005     3    White    200             4006     4      Red    300             1007     4    White    400             2008     5      Red    100             3009     5    White    200             400旋转的另一个想法是 use DataFrame.pivot,然后DataFrame.shift使用DataFrame.stackforSeries和 last add new column by 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 WEEK0      1      Red   1    100            10                    01      1    White   1    200            20                    02      2      Red   1    300            30                  1003      2    White   1    400            40                  2004      3      Red   1    100            10                  3005      3    White   1    200            20                  4006      4      Red   1    300            30                  1007      4    White   1    400            40                  2008      5      Red   1    100            10                  3009      5    White   1    200            20                  40010     1      Red   2    100            10                    011     1    White   2    200            20                    012     2      Red   2    300            30                  10013     2    White   2    400            40                  20014     3      Red   2    100            10                  30015     3    White   2    200            20                  40016     4      Red   2    300            30                  10017     4    White   2    400            40                  20018     5      Red   2    100            10                  30019     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
随时随地看视频慕课网APP

相关分类

Python
我要回答