首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫创造新栏目的条件转换

熊猫创造新栏目的条件转换
EN

Stack Overflow用户
提问于 2022-03-02 11:49:51
回答 1查看 42关注 0票数 0

我的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循环实现它:

代码语言:javascript
复制
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])

我们能更有效地实施吗?

EN

回答 1

Stack Overflow用户

发布于 2022-03-02 14:47:49

这大概是我的方法。您可以通过重新索引DataFrame来添加缺失的销售数据,这样就可以直接使用week和ItemNo的组合来查找销售情况。

另外,我还没有处理好最后/最高的一周。

代码语言:javascript
复制
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],
})
代码语言:javascript
复制
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”对我来说更有意义,让未知的那些空着.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71322208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档