如何在 Pandas 数据帧中使用 collect_list 复制 Spark window 函数?

How to replicate a Spark window function with collect_list in Pandas dataframes?

我有一个初始数据框

df1 = 
+---+---+---+
|  A|  B|  C|
+---+---+---+
|  1|  1| 10|
|  1|  2| 11|
|  1|  2| 12|
|  3|  1| 13|
|  2|  1| 14|
|  2|  1| 15|
|  2|  1| 16|
|  4|  1| 17|
|  4|  2| 18|
|  4|  3| 19|
|  4|  4| 19|
|  4|  5| 20|
|  4|  5| 20|
+---+---+---+

使用 pyspark 我使用 collect_list 函数使用 window 函数对数据框进行编码,同时考虑到分组列 'A' 并考虑到列 'B'排序以创建具有累积列表的列

spec = Window.partitionBy('A').orderBy('B')
df1 = df1.withColumn('D',collect_list('C').over(spec))

df1.orderBy('A','B').show()

+---+---+---+------------------------+
|A  |B  |C  |D                       |
+---+---+---+------------------------+
|1  |1  |10 |[10]                    |
|1  |2  |11 |[10, 11, 12]            |
|1  |2  |12 |[10, 11, 12]            |
|2  |1  |14 |[14, 15, 16]            |
|2  |1  |15 |[14, 15, 16]            |
|2  |1  |16 |[14, 15, 16]            |
|3  |1  |13 |[13]                    |
|4  |1  |17 |[17]                    |
|4  |2  |18 |[17, 18]                |
|4  |3  |19 |[17, 18, 19]            |
|4  |4  |19 |[17, 18, 19, 19]        |
|4  |5  |20 |[17, 18, 19, 19, 20, 20]|
|4  |5  |20 |[17, 18, 19, 19, 20, 20]|
+---+---+---+------------------------+


是否可以使用 Pandas Dataframe 进行相同的计算?

我尝试使用一些“普通”python 代码,但可能有更直接的方法。

在 pandas 中解决此问题的一种方法是使用两个 groupby,即首先在列 A 上对数据框进行分组,然后为每个组应用自定义函数 collect_list,其中按列 B 转换组输入并使用 list

累积聚合列 C
def collect_list(g):
    return g.groupby('B')['C'].agg(list).cumsum()

df.sort_values(['A', 'B']).merge(
    df.groupby('A').apply(collect_list).reset_index(name='D'))

    A  B   C                         D
0   1  1  10                      [10]
1   1  2  11              [10, 11, 12]
2   1  2  12              [10, 11, 12]
4   2  1  14              [14, 15, 16]
5   2  1  15              [14, 15, 16]
6   2  1  16              [14, 15, 16]
3   3  1  13                      [13]
7   4  1  17                      [17]
8   4  2  18                  [17, 18]
9   4  3  19              [17, 18, 19]
10  4  4  19          [17, 18, 19, 19]
11  4  5  20  [17, 18, 19, 19, 20, 20]
12  4  5  20  [17, 18, 19, 19, 20, 20]