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)