我的数据框为:
data = [ ['A',1,200,200],['A',2,-30,],3,500,4,10,5,-45,['B',30,500],12,50,]]
df = pd.DataFrame(data,columns = ['batch','idx','op_sum','var3'])
我正在尝试获得以下结果:
batch idx op_sum var3
A 1 200 200
A 2 -30 -30
A 3 500 -30
A 4 10 -30
A 5 -45 -45
B 1 30 500
B 2 12 12
B 3 50 12
逻辑是:
If cur row(op_sum) < previous row(var3) then
cur row(var3) = cur row(op_sum)
else cur row(var3) = previous row(var3)
注意:我可以使用iterrows和iloc来实现,但对于数百万行而言并不实用。
我在向量化方面已经走了这么远:
#(a)
df.var3.ix[(df.op_sum<df.var3.shift()) | (df.var3.shift().isnull())] = df.op_sum.ix[(df.op_sum<df.var3.shift()) | (df.var3.shift().isnull())]
#(b)
df.var3.ix[(df.op_sum>df.var3.shift())] = df.var3.shift().ix[(df.op_sum>df.var3.shift())]
这将产生以下内容:
batch idx op_sum var3
A 1 200 200
A 2 -30 -30
A 3 500 -30
A 4 10 -10 #Not Good
A 5 -45 -45
B 1 30 -45 #Not Good
B 2 12 12
B 3 50 12
当op_sum = 10> var3.shift()= -30时,应该给我var3 = -30,同样,对于另一个不好的值!
另外,当我尝试先执行df.groupby('batch')
来执行(a)和(b)时,它会给我AttributeError: Cannot access callable attribute 'ix' of 'SeriesGroupby' objects,try using 'apply' method
!
请帮助我克服终点线。非常感激。