【问题标题】:How to edit running total column to restart with every new column value?如何编辑运行总计列以使用每个新列值重新启动?
【发布时间】:2021-06-29 10:20:43
【问题描述】:

我有下图所示的数据框。每次“项目编号”列中有新值时,我都需要重新启动“总编号”列。例如,如果索引 4 是 104430-003 的最后一次出现,那么 14 将是最后一个“Total #”,它将开始在适当的“Bin Loc”中重新计算 VTHY-039 的“Total #”。

一旦我确定了那部分,我的最后一步就是在“Total #”等于或大于 PV Pick # 之后删除任何相同的剩余“Item Numbers”。

Code

【问题讨论】:

    标签: python pandas group-by cumsum


    【解决方案1】:
    pv['cumsum'] = pv.groupby('Item Number')['Items'].transform(pd.Series.cumsum)
    
    pv
    
        Item Number Bin Loc.    PV Pick Items   cumsum
    0   104430-003  A-P28-17B   4   2   2
    1   104430-003  A-P39-20B   4   4   6
    2   104430-003  A-P39-20C   4   1   7
    3   104430-003  A-P39-26C   4   2   9
    4   104430-003  A-P40-23C   4   5   14
    ... ... ... ... ... ...
    829 VTHY-039    A-P45-09B   1   2   36
    830 VTHY-039    A-P45-13B   1   2   38
    831 VTHY-039    A-P45-19B   1   2   40
    832 VTHY-039    A-P45-21B   1   3   43
    833 VTHY-039    A-P46-21B   1   2   45
    

    【讨论】:

      【解决方案2】:

      您可以使用 .loc 完成所有这些工作。首先,遍历所有唯一的项目编号并使用 .loc 到 transform a subset of columns。然后使用 .loc 仅选择 Total 的行

      import pandas as pd
      
      df = pd.DataFrame({'Item Number': ['104430-003', '104430-003', '104430-003', 'VTHY-039', 'VTHY-039', 'VTHY-039', 'VTHY-039'],
                        'PV Pick': [4, 4, 4, 1, 1, 1, 1],
                        'Items': [2, 4, 1, 2, 2, 2, 3]})
      
      items = df['Item Number'].unique()
      for item in items:
          df.loc[df['Item Number'] == item, 'Total'] = df.loc[df['Item Number'] == item, 'Items'].cumsum()
      
      df = df.loc[df['Total'] < df['PV Pick']]
      

      这是运行 for 循环后的输出:

      在选择 Total

      编辑:

      要回答您的评论,您可以在循环中使用 .loc 查找 'Total' >= 'PV Pick' 的行,使用 iloc 仅抓取第一行,并将这些值附加到 breakeven_final。然后你可以将 df 与 df_breakeven_final 连接起来。

      breakeven_final = []
      for item in items:
          df.loc[df['Item Number'] == item, 'Total'] = df.loc[df['Item Number'] == item, 'Items'].cumsum()
          breakeven = df.loc[df['Item Number'] == item].loc[df['Total'] >= df['PV Pick']].iloc[0]
          breakeven_final.append(breakeven.values)
      
      df_breakeven_final = pd.DataFrame(breakeven_final, columns=df.columns.values)
      
      df = df.loc[df['Total'] < df['PV Pick']]
      
      df_final = pd.concat([df, df_breakeven_final]).reset_index(drop=True)
      

      df_final 的输出(注意索引已被重置):

      【讨论】:

      • 这太接近了!该循环非常棒,并且比我想出的答案更有效,但我需要的是最终输出显示每个“项目编号”的每一行,直到“总”值大于或等于“PV Pick” ' 价值。然后我想删除该特定“项目编号”的所有后续行。因此,例如在您的第一个输出中,它将显示索引 0、1 和 3。
      • 我已经编辑了我的帖子以解决您的评论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 2020-11-19
      • 2018-10-05
      • 1970-01-01
      相关资源
      最近更新 更多