将forloop转换为窗口函数

2024-09-25 08:27:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个大的(spark)数据帧,需要计算一个新列。每一行都是根据同一列中前一行的值计算的(新列中的第一行仅为1)。这在for循环中是微不足道的,但是由于窗口函数中的行数非常多,我们希望这样做。因为当前行的输入是前一行,所以如果可能的话,我们不知道如何实现这一点。你知道吗

我们有一个大型数据框,其中一列包含三个值:a、B和C。这三个选项中的每一个都表示一个公式,用于计算同一行中新列中的新值。你知道吗

  • 如果是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循环更快的替代方法?(reduce函数会有类似的性能?)你知道吗

同样,由于行数非常多,这与性能有关。我们应该有足够的RAM来存储内存中的所有内容,但是我们希望处理过程尽可能快(并且学习如何更普遍地解决这个问题的类似问题:应用需要在该窗口函数的前几行中计算的数据的窗口函数)。任何帮助都将不胜感激!!你知道吗

谨致问候, 米克


Tags: 数据函数dfnewforindexmy选项