我的dataset/datafame如下所示:

我想增加六列-一周,一周-2,周-3,销售-1,销售-2,销售-3在数据。第一周是本周减去2,第二周是前一周,第三周是下周。同样,销售-1是前一周的销售,2是前一周的销售,3是下一周的销售。就202201财政周而言,前一周和前一周缺勤,因此202201之后的3周变成1周、2周和3周。前一周的202202周缺席,因此202201,202203和202204成为第一周,第二周和第三周。在202205财政周,下周缺席,因此202202,202203,202204是三位候选人。同样,选择了sales-1、sales-2和sales-3的值。简单地说,选择4行,包括当前行,其中前2行是当前行的两行,最后一行是当前行之后的行。如果当前行的位置不存在任何位置行,则该窗口向下/向上移动,以得到一个包含当前窗口的4行窗口。
最后的dataframe应该是这样的:

目前,我正在使用2 for循环实现它:
df_final = pd.DataFrame()
for item in df['ItemNo'].unique() :
df_temp = df[df.ItemNo==item].sort_values(by=['Fiscal_Week'])
sale_wk_minus2 = []
sale_wk_minus1 = []
sale_wk_plus1 = []
wk_minus2 = []
wk_minus1 = []
wk_plus1 = []
for i in range(len(df_temp)):
if(i==0):
wk_m2 = df_temp. Fiscal_Week.iloc[i+1]
wk_m1 = df_temp. Fiscal_Week.iloc[i+2]
wk_p1 = df_temp. Fiscal_Week.iloc[i+3]
sale_m2 = df_temp.Sales.iloc[i+1]
sale_m1 = df_temp.Sales.iloc[i+2]
sale_plus2 = df_temp.Sales.iloc[i+3]
if(i==1):
wk_m2 = df_temp. Fiscal_Week.iloc[i-1]
wk_m1 = df_temp. Fiscal_Week.iloc[i+1]
wk_p1 = df_temp. Fiscal_Week.iloc[i+2]
sale_m2 = df_temp.Sales.iloc[i-1]
sale_m1 = df_temp.Sales.iloc[i+1]
sale_plus2 = df_temp.Sales.iloc[i+2]
if(i==( len(df_temp)-1)):
wk_m2 = df_temp. Fiscal_Week.iloc[i-3]
wk_m1 = df_temp. Fiscal_Week.iloc[i-2]
wk_p1 = df_temp. Fiscal_Week.iloc[i-1]
sale_m2 = df_temp.Sales.iloc[i-3]
sale_m1 = df_temp.Sales.iloc[i-2]
sale_plus2 = df_temp.Sales.iloc[i-1]
if((i>1) and (i<len(df_temp)-1)):
wk_m2 = df_temp. Fiscal_Week.iloc[i-2]
wk_m1 = df_temp. Fiscal_Week.iloc[i-1]
wk_p1 = df_temp. Fiscal_Week.iloc[i+1]
sale_m2 = df_temp.Sales.iloc[i-2]
sale_m1 = df_temp.Sales.iloc[i-1]
sale_plus2 = df_temp.Sales.iloc[i+1]
df_temp['week_minus_2'] = wk_minus2
df_temp['week_minus_1'] = wk_minus1
df_temp['week_plus_1'] = wk_plus1
df_temp['sales_minus_2'] = sale_wk_minus2
df_temp['sales_minus_1'] = sale_wk_minus1
df_temp['sales_plus_1'] = sale_wk_plus1
df_final = pd.concat( [df_final, df_temp])我们能更有效地实施吗?
发布于 2022-03-02 14:47:49
这大概是我的方法。您可以通过重新索引DataFrame来添加缺失的销售数据,这样就可以直接使用week和ItemNo的组合来查找销售情况。
另外,我还没有处理好最后/最高的一周。
import pandas as pd
df = pd.DataFrame({
"ItemNo": [21, 21, 21, 21, 21, 29, 29, 29, 29, 29],
"Fiscal_Week": ["202201", "202202", "202203", "202204", "202205"] * 2,
"Sales": [45, 55, 65, 75, 85, 22, 32, 42, 52, 62],
})df["Week"] = pd.to_datetime(df["Fiscal_Week"], format="%Y%m").dt.to_period('M')
df["Week-1"] = df["Week"] - 2
df["Week-2"] = df["Week"] - 1
df["Week-3"] = df["Week"] + 1
# Overwrite first week entries
week0idx = df[["Week-1"]].idxmin()
week0 = df.loc[week0idx,"Week"].iloc[0]
week0idxs = df["Week"][df["Week"] == week0].index
df.loc[week0idxs,["Week-1","Week-2","Week-3"]] = [week0 + 1, week0 + 2, week0 + 3]
# Overwrite second week entries
week1idx = df[["Week-1"]].idxmin()
week1 = df.loc[week1idx,"Week"].iloc[0]
week1idxs = df["Week"][df["Week"] == week1].index
df.loc[week1idx,["Week-1","Week-2","Week-3"]] = [week1 - 1, week1 + 1, week1 + 2]这个任务有点奇怪,对我来说“周减3”、“负2”、“负1”和“加1”对我来说更有意义,让未知的那些空着.
https://stackoverflow.com/questions/71322208
复制相似问题