Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将for循环转换为窗口函数_Python_Apache Spark - Fatal编程技术网

Python 将for循环转换为窗口函数

Python 将for循环转换为窗口函数,python,apache-spark,Python,Apache Spark,我们有一个大的(spark)数据帧,需要计算一个新列。每一行都是根据同一列中前一行的值计算的(新列中的第一行仅为1)。这在for循环中很简单,但由于我们希望在窗口函数中执行此操作的行数非常多。因为当前行的输入是前一行,所以我们不清楚如何实现这一点,如果可能的话 我们有一个大型数据框,其中一列包含三个值中的一个:a、B和C。这三个选项中的每一个都表示一个公式,用于计算同一行中新列中的新值 如果是A,则新值为1 如果是B,则新值与前一行相同 如果是C,则新值与前一行+1相同 例如: A B B

我们有一个大的(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循环。我们尝试使用'lag'关键字,但前一行的值取决于以前的计算。有没有办法做到这一点,或者用窗口(或贴图)功能根本不可能做到这一点?如果不可能,有没有比for循环更快的替代方案?(reduce函数是否具有类似的性能?)

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

亲切问候,,
Mick

需要详细说明的一些要点:我们尝试了“lag”函数(Pandas有一个等价的函数“shift”)来创建一个包含上一行值的帮助列,但由于上一行中的值在该点上还未知,因此无法解决问题。如前所述,我们不希望出现RAM问题,我们只是希望优化CPU处理整个(大型)数据集所需的时间。提供的伪代码是为了清楚起见,我们在实际代码中应用了策略设计模式,但我认为这更具可读性。如果由于计算依赖于新列中以前条目的计算,无法将窗口/映射(在“应用”中)函数应用于此问题(我目前怀疑这一点),这将是一个可以接受的答案。需要详细说明的一些小问题:我们尝试了“lag”函数(Pandas有一个等价的函数“shift”)来创建一个包含前一行中的值的helper列,但由于前一行中的值在该点上还未知,因此无法解决问题。如前所述,我们不希望出现RAM问题,我们只是希望优化CPU处理整个(大型)数据集所需的时间。提供的伪代码是为了清楚起见,我们在实际代码中应用了策略设计模式,但我认为这更具可读性。如果由于计算依赖于新列中以前条目的计算,无法将窗口/映射(在“应用”中)函数应用于此问题(我目前怀疑这一点),这是一个可以接受的答案。
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