Преобразование цикла for в оконную функцию - PullRequest
1 голос
/ 21 октября 2019

У нас есть большой (искровой) фрейм данных, и нам нужно вычислить новый столбец. Каждая строка рассчитывается из значения в предыдущей строке в том же столбце (первая строка в новом столбце просто 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? (Функция уменьшения будет иметь аналогичную производительность?)

Опять же, из-за чрезвычайно большого количества строк, речь идет о производительности. У нас должно быть достаточно оперативной памяти, чтобы хранить все в памяти, но мы хотим, чтобы обработка была максимально быстрой (и чтобы научиться решать аналоги этой проблемы в более общем плане: применять оконные функции, которые требуют данных, вычисленных в предыдущих строках этой оконной функции). Любая помощь будет высоко ценится!

С уважением, Мик

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...