首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python保留函数。在计算中使用前一行中的值

Python保留函数。在计算中使用前一行中的值
EN

Stack Overflow用户
提问于 2020-04-22 00:26:33
回答 2查看 87关注 0票数 1
代码语言:javascript
运行
复制
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

想要的输出:

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

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

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

在考虑性能的情况下,最快的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-22 00:32:35

您可以使用groupby来完成此操作,其中cumsum位于'DEMAND‘列,shift位于前面创建的'AI_AFTER’列:

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2020-04-22 00:47:06

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

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61348293

复制
相关文章

相似问题

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