Почему не работает векторный код Python для сравнения значений по строкам? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть датафрейм:


    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!

Пожалуйста, помогите мне преодолеть финишную черту. Очень признателен.

1 Ответ

1 голос
/ 08 ноября 2019

Я считаю, что вам нужно GroupBy.cummin:

df['var3'] = df.groupby('batch')['op_sum'].cummin()
print (df)
  batch  idx  op_sum  var3
0     A    1     200   200
1     A    2     -30   -30
2     A    3     500   -30
3     A    4      10   -30
4     A    5     -45   -45
5     B    1      30    30
6     B    2      12    12
7     B    3      50    12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...