【问题标题】:Inserting rows in df based on groupby using value of previous row使用前一行的值根据 groupby 在 df 中插入行
【发布时间】:2021-07-22 15:55:19
【问题描述】:

我需要基于 groupby 类型的列周插入行,在某些情况下,我在数据框中间的不同位置缺少周,我想插入行以填充缺失的行作为副本最后一个现有行,在这种情况下,第 7 周的副本填写第 8 周和第 9 周,第 11 周的副本填写第 12、13 和 14 周的行:在此表上,您可以看到从第 7 周到第 10 周的跳跃从 11 点到 15 点:

完美的输出如下:以正确方式在列周中具有增量值的最终表:

下面是我的代码,它只插入一行,我很困惑为什么:

def middle_values(final : DataFrame) -> DataFrame:
    finaltemp= pd.DataFrame()
    out= pd.DataFrame()
    for i in range(0, len(final)):
        for f in range(1, 52 , 1):
            if final.iat[i,8]==  f and final.iat[i-1,8] != f-1 :
               if final.iat[i,8] > final.iat[i-1,8] and  final.iat[i,8] != (final.iat[i-1,8] - 1):
                    line = final.iloc[i-1]
                    c1 = final[0:i]
                    c2 = final[i:]
                    c1.loc[i]=line
                    concatinated = pd.concat([c1, c2])
                    concatinated.reset_index(inplace=True)
                    concatinated.iat[i,11] = concatinated.iat[i-1,11]
                    concatinated.iat[i,9]= f-1
                    finaltemp = finaltemp.append(concatinated)
    
    if 'type' in finaltemp.columns:
      for name, groups in finaltemp.groupby(["type"]):
        weeks = range(groups['week'].min(), groups['week'].max()+1)
        out = out.append(pd.merge(finaltemp, pd.Series(weeks, name='week'), how='right').ffill())
      out.drop_duplicates(subset=['project', 'week'], keep = 'first', inplace=True)
      out.drop_duplicates(inplace = True)
      out.sort_values(["Budget: Budget Name", "Budget Week"], ascending = (False, True), inplace=True)
        out.drop(['level_0'], axis = 1, inplace=True)
        out.reset_index(inplace=True)
        out.drop(['level_0'], axis = 1, inplace=True)
        return out
    else :
        return final

【问题讨论】:

    标签: python pandas dataframe missing-data


    【解决方案1】:

    对于您问题的第一部分。假设我们有一个如下的数据框:

    df = DataFrame({"project":[1,1,1,2,2,2], "week":[1,3,4,1,2,4], "value":[12,22,18,17,18,23]})
    

    我们可以创建一个新的多索引来获取我们需要的额外行

    new_index = pd.MultiIndex.from_arrays([sorted([i for i in df['project'].unique()]*52), 
                               [i for i in np.arange(1,53,1)]*df['project'].unique().shape[0]], names=['project', 'week'])
    

    然后我们可以应用此索引来获取您需要的新数据框,新行中有空格

    df = df.set_index(['project', 'week']).reindex(new_index).reset_index().sort_values(['project', 'week'])
    

    然后,您需要使用 groupby 和 transform 应用前向填充(使用 ffill)或后向填充(使用 bfill),以在您需要的行中获取所需的值。

    【讨论】:

      猜你喜欢
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 2023-03-24
      • 2016-09-19
      • 1970-01-01
      • 2020-12-03
      相关资源
      最近更新 更多