Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于行值迭代地重新计算表中列的值_Python_Pandas - Fatal编程技术网

Python 基于行值迭代地重新计算表中列的值

Python 基于行值迭代地重新计算表中列的值,python,pandas,Python,Pandas,我有一个熊猫数据帧df: import pandas as pd df = pd.DataFrame({'item':[1,1,1,1,1,1,2,2,2,2,2,2], 'date':['2017-03-27','2017-04-03','2017-04-10','2017-04-17','2017-04-24','2017-05-01', '2017-03-27','2017-04-03','2017-04-10','2017-04-17','2017-04-2

我有一个熊猫数据帧
df

import pandas as pd
df = pd.DataFrame({'item':[1,1,1,1,1,1,2,2,2,2,2,2],
               'date':['2017-03-27','2017-04-03','2017-04-10','2017-04-17','2017-04-24','2017-05-01', '2017-03-27','2017-04-03','2017-04-10','2017-04-17','2017-04-24','2017-05-01'],
               'sls':[3,4,5,3,2,3,5,6,10,4,5,2],
               'prc':[0,2,0,1,1,7,2,4,0,1,1,1],
               'stk':[7,0,0,0,0,0,12,0,0,0,0,0]})
这看起来像:


项目日期sls中国stk
0      1  2017-03-27    3    0    7
1      1  2017-04-03    4    2    0
2      1  2017-04-10    5    0    0
3      1  2017-04-17    3    1    0
4      1  2017-04-24    2    1    0
5      1  2017-05-01    3    7    0
6      2  2017-03-27    5    2   12
7      2  2017-04-03    6    4    0
8      2  2017-04-10   10    0    0
9      2  2017-04-17    4    1    0
10     2  2017-04-24    5    1    0
11     2  2017-05-01    2    1    0

我想计算列
stk
的值,除了每个
项目的第一条记录之外

我用计算值创建了另一列stock:

def f(g):
g.stk = (g.stk.shift() + g.prc - g.sls).cumsum()
return g

df['stock'] = df.stk.replace(0, df.groupby('item').apply(f).stk)
因此,我更新的数据框架变成:


项目日期sls中国stk库存
0      1  2017-03-27    3    0    7      7
1      1  2017-04-03    4    2    0      5
2      1  2017-04-10    5    0    0      0
3      1  2017-04-17    3    1    0     -2
4      1  2017-04-24    2    1    0     -3
5      1  2017-05-01    3    7    0      1
6      2  2017-03-27    5    2   12     12
7      2  2017-04-03    6    4    0     10
8      2  2017-04-10   10    0    0      0
9      2  2017-04-17    4    1    0     -3
10     2  2017-04-24    5    1    0     -7
11     2  2017-05-01    2    1    0     -8

但是我不想在
stock
列中出现负值。因此,我如何进行迭代计算,如果对于
项目
组,如果
库存
列中的记录中存在负值,则必须将该数字添加到第一个记录中的值,然后再次进行计算。直到没有更多的负值

中的
stock
列计算为(stk-1)时的值-sls时的值+prc时的值

我的预期输出如下所示:


项目日期sls中国stk库存
0      1  2017-03-27    3    0    7     10
1      1  2017-04-03    4    2    0      8
2      1  2017-04-10    5    0    0      3
3      1  2017-04-17    3    1    0      1
4      1  2017-04-24    2    1    0      0
5      1  2017-05-01    3    7    0      4
6      2  2017-03-27    5    2   12     20
7      2  2017-04-03    6    4    0     18
8      2  2017-04-10   10    0    0      8
9      2  2017-04-17    4    1    0      5
10     2  2017-04-24    5    1    0      1
11     2  2017-05-01    2    1    0      0


如何在熊猫中执行相同操作?

按原样执行,然后将最小负值添加到列中

df = pd.DataFrame({'item':[1,1,1,1,1,1,2,2,2,2,2,2],
               'date':['2017-03-27','2017-04-03','2017-04-10','2017-04-17','2017-04-24','2017-05-01', '2017-03-27','2017-04-03','2017-04-10','2017-04-17','2017-04-24','2017-05-01'],
               'sls':[3,4,5,3,2,3,5,6,10,4,5,2],
               'prc':[0,2,0,1,1,7,2,4,0,1,1,1],
               'stk':[7,0,0,0,0,0,12,0,0,0,0,0]})

def f(g):
    g.stk = (g.stk.shift() + g.prc - g.sls).cumsum()
    return g

df['stock'] = df.stk.replace(0, df.groupby('item').apply(f).stk)
df['stock'] = df.groupby('item')['stock'].apply(lambda x: x - x.min() if x.min() < 0 else 0) 

df=pd.DataFrame({'item':[1,1,1,1,1,2,2,2,2],
‘日期’:[‘2017-03-27’、‘2017-04-03’、‘2017-04-10’、‘2017-04-17’、‘2017-04-24’、‘2017-05-01’、‘2017-03-27’、‘2017-04-03’、‘2017-04-10’、‘2017-04-17’、‘2017-04-24’、‘2017-05-01’],
“sls”:[3,4,5,3,2,3,5,6,10,4,5,2],
“prc”:[0,2,0,1,1,7,2,4,0,1,1,1],
‘stk’:[7,0,0,0,0,0,12,0,0,0,0,0]})
def f(g):
g、 stk=(g.stk.shift()+g.prc-g.sls).cumsum()
返回g
df['stock']=df.stk.replace(0,df.groupby('item')。apply(f.stk)
df['stock']=df.groupby('item')['stock'].apply(lambda x:x-x.min(),如果x.min()小于0,则为0)
快速解决方案:

df['stock'] -= (df.groupby('item').stock
                  .transform(lambda x: x.min() if x.min()<0 else 0)
df['stock']-=(df.groupby('item').stock

.transform(lambda x:x.min()如果x.min()可以尝试运行解决方案吗,第一组的值出现错误对不起,忘记了groupby df['stock']=df.groupby('item')['stock'])。应用(lambda x:x-x.min()如果x.min()<0,则0)