У нас есть большой (искровой) фрейм данных, и нам нужно вычислить новый столбец. Каждая строка рассчитывается из значения в предыдущей строке в том же столбце (первая строка в новом столбце просто 1). Это тривиально в цикле for, но из-за чрезвычайно большого числа строк мы хотим сделать это в оконной функции. Поскольку вход в текущую строку является предыдущей строкой, для нас не очевидно, как мы можем достичь этого, если это возможно.
У нас есть большой фрейм данных со столбцом, содержащим одно из трех значений: A,B и C. Каждый из этих 3 параметров представляет собой формулу для вычисления нового значения в новом столбце в той же строке.
- Если это A, тогда новое значение равно 1.
- Если это B, то новое значение совпадает с предыдущей строкой.
- Если это C, то новое значение совпадает с предыдущей строкой + 1.
Например:
A
B
B
C
B
A
C
B
C
A
Должно стать:
A 1
B 1
B 1
C 2
B 2
A 1
C 2
B 2
C 3
A 1
Мы можем добиться этого поведения, используя цикл for (псевдокод):
for index in range(my_df):
if index == 0:
my_df[new_column][index] = 1
elseif my_df[letter_column][index] == 'A':
my_df[new_column][index] = 1
elseif my_df[letter_column][index] == 'B':
my_df[new_column][index] = my_df[new_column][index-1]
elseif my_df[letter_column][index] == 'C':
my_df[new_column][index] = my_df[new_column][index-1] + 1
Мы хотим заменить цикл for оконной функцией. Мы попытались использовать ключевое слово 'lag', но значение предыдущей строки зависит от предыдущих вычислений. Есть ли способ сделать это или это принципиально невозможно сделать с помощью функции окна (или карты)? И если это невозможно, есть ли альтернатива, которая будет быстрее, чем цикл for? (Функция уменьшения будет иметь аналогичную производительность?)
Опять же, из-за чрезвычайно большого количества строк, речь идет о производительности. У нас должно быть достаточно оперативной памяти, чтобы хранить все в памяти, но мы хотим, чтобы обработка была максимально быстрой (и чтобы научиться решать аналоги этой проблемы в более общем плане: применять оконные функции, которые требуют данных, вычисленных в предыдущих строках этой оконной функции). Любая помощь будет высоко ценится!
С уважением, Мик