У меня есть датафрейм:
data = [ ['A',1,200,200],
['A',2,-30,],
['A',3,500,],
['A',4,10,],
['A',5,-45,],
['B',1,30,500],
['B',2,12,],
['B',3,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 и аналогично для другого не очень хорошего значения!
Также, когда я пытаюсь выполнить эту операцию (a) и (б), выполнив сначала df.groupby('batch')
, это даст мне AttributeError: Cannot access callable attribute 'ix' of 'SeriesGroupby' objects, try using 'apply' method
!
Пожалуйста, помогите мне преодолеть финишную черту. Очень признателен.