熊猫:给出最终值

时间:2018-05-22 00:53:09

标签: python python-3.x pandas numpy

我编写了一个Pyhton脚本,根据实际库存,在过去365天内从今天开始重新计算特定SKU。为此,我使用了Python Pandas Dataframe,如下所示:

Index   DATE    SUM_IN  SUM_OUT
0      5/12/18   500        0
1      5/13/18    0      -403
2      5/14/18    0       -58
3      5/15/18    0       -39
4      5/16/18   100        0
5      5/17/18    0       -98
6      5/18/18   276        0
7      5/19/18    0      -139
8      5/20/18    0       -59
9      5/21/18    0       -70

数据框显示仓库的数量IN和OUT的总和,按日期分组。我的目的是添加一个名为" STOCK"的列。表示所代表日的SKU的库存水平。为此,我所拥有的是实际库存水平(指数9)。所以我需要的是在所有日期系列中逐日重新计算所有级别(从索引9到索引0)。

在Excel中很容易。我可以将实际级别放在最后一行,只是扩展计算直到我到达索引0的行。如图所示(列E是公式,列G是所需的输出):

Inventory Recalculation on Excel

有人可以帮我实现这个结果吗?

我已经拥有最后一天的库存水平(即5/21/2018等于10)。我需要的是将数字10放在索引9中并计算其他过去几天的库存水平,从索引8到0。

所需的输出应为:

Index   DATE    TRANSACTION_IN  TRANSACTION_OUT SUM_IN  SUM_OUT STOCK
0      5/12/18         1                 0        500      0     500
1      5/13/18         0                 90        0     -403     97
2      5/14/18         0                 11        0     -58      39
3      5/15/18         0                 11        0     -39      0
4      5/16/18         1                 0        100      0     100
5      5/17/18         0                 17        0     -98      2
6      5/18/18         1                 0        276      0     278
7      5/19/18         0                 12        0    -139     139
8      5/20/18         0                 4         0    -59       80
9      5/21/18         0                 7         0    -70       10

2 个答案:

答案 0 :(得分:2)

(更新)

last_stock = 10  # You should try another value
a = (df.SUM_IN + df.SUM_OUT).cumsum()
df["STOCK"] = a - (a.iloc[-1] - last_stock)

答案 1 :(得分:1)

使用cumsumgroupby创建密钥,然后我们再次使用cumsum

df['SUM_IN'].replace(0,np.nan).ffill()+df.groupby(df['SUM_IN'].gt(0).cumsum()).SUM_OUT.cumsum()
Out[292]: 
0    500.0
1     97.0
2     39.0
3      0.0
4    100.0
5      2.0
6    276.0
7    137.0
8     78.0
9      8.0
dtype: float64

更新

s=df['SUM_IN'].replace(0,np.nan).ffill()+df.groupby(df['SUM_IN'].gt(0).cumsum()).SUM_OUT.cumsum()-df.STOCK
df['SUM_IN'].replace(0,np.nan).ffill()+df.groupby(df['SUM_IN'].gt(0).cumsum()).SUM_OUT.cumsum()-s.groupby(df['SUM_IN'].gt(0).cumsum()).bfill().fillna(0)
Out[318]: 
0    500.0
1     97.0
2     39.0
3      0.0
4    100.0
5      2.0
6    278.0
7    139.0
8     80.0
9     10.0
dtype: float64