【问题标题】:Python Retain function. Use value from previous row in calculationPython 保留函数。在计算中使用上一行的值
【发布时间】:2020-04-21 16:26:32
【问题描述】:
In [10]: df
Out[10]:
     PART AVAILABLE_INVENTORY DEMAND
1    A    12                  6
2    A    12                  2
3    A    12                  1
4    B    24                  1
5    B    24                  1
6    B    24                  4
7    B    24                  3

想要的输出:

     PART AVAILABLE_INVENTORY DEMAND  AI   AI_AFTER
1    A    12                  6       12   6
2    A    12                  2       6    4
3    A    12                  1       4    3
4    B    24                  1       24   23
5    B    24                  1       23   22
6    B    24                  4       22   18
7    B    24                  3       18   15

到目前为止我的代码如下,但它没有给出我正在寻找的输出:

def retain(df):
    df['PREV_PART'] = df['PART'].shift()
    df['PREV_AI_AFTER'] = df['AI'].shift() - df['DEMAND'].shift()
    df['AI'] = np.where(df['PART'] != df['PREV_PART'], df['AI'], df['PREV_AI_AFTER'])
    df['AI_AFTER'] = df['AI'] - df['DEMAND']

df['AI'] = df['AVAILABLE_INVENTORY']
retain(df)

考虑到性能,最快的方法是什么?

【问题讨论】:

    标签: python pandas retain


    【解决方案1】:

    您可以使用 groupby 在“DEMAND”列上使用 cumsum 并在之前刚刚创建的“AI_AFTER”列上使用 shift

    df['AI_AFTER'] = df['AVAILABLE_INVENTORY'] - df.groupby('PART')['DEMAND'].cumsum()
    df['AI'] = df.groupby('PART')['AI_AFTER'].shift().fillna(df['AVAILABLE_INVENTORY'])
    print (df)
      PART  AVAILABLE_INVENTORY  DEMAND  AI_AFTER    AI
    1    A                   12       6         6  12.0
    2    A                   12       2         4   6.0
    3    A                   12       1         3   4.0
    4    B                   24       1        23  24.0
    5    B                   24       1        22  23.0
    6    B                   24       4        18  22.0
    7    B                   24       3        15  18.0
    

    【讨论】:

      【解决方案2】:

      VERRRY 类似于​​Ben.T's Answer。如果您喜欢这种方法,请选择他们的答案。我就是这样安排流程的。

      def f(d):
          i = d.AVAILABLE_INVENTORY
          c = d.DEMAND.cumsum()
          return pd.concat({'AI': i - c.shift(fill_value=0), 'AI_AFTER': i - c}, axis=1)
      
      df.join(df.groupby('PART').apply(f))
      
        PART  AVAILABLE_INVENTORY  DEMAND  AI  AI_AFTER
      1    A                   12       6  12         6
      2    A                   12       2   6         4
      3    A                   12       1   4         3
      4    B                   24       1  24        23
      5    B                   24       1  23        22
      6    B                   24       4  22        18
      7    B                   24       3  18        15
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-24
        • 1970-01-01
        • 1970-01-01
        • 2020-01-08
        相关资源
        最近更新 更多