列表如下:这是pyspark中的一个数据框
id | list1 | list2 |
---|---|---|
1 | [10, 20, 30] | [30, 40, 50] |
2 | [35, 65, 85] | [15, 5, 45] |
这是所需的输出。计算每个列表的平均值并从列表中的每个元素中减去平均值。我正在为此使用 pyspark。
id | list1 | list2 |
---|---|---|
1 | [10-mean, 20-mean, 30-mean] | [30-mean, 40-mean, 50-mean] |
2 | [35-mean, 65-mean, 85-mean] | [15-mean, 5-mean, 45-mean] |
答案 0 :(得分:1)
您可以使用 aggregate
计算每个列表的平均值,然后在数组列上使用 transform
函数减去每个元素的平均值:
from pyspark.sql import functions as F
df1 = df.withColumn("list1_avg", F.expr("aggregate(list1, bigint(0), (acc, x) -> acc + x, acc -> acc / size(list1))")) \
.withColumn("list2_avg", F.expr("aggregate(list2, bigint(0), (acc, x) -> acc + x, acc -> acc / size(list2))")) \
.withColumn("list1", F.expr("transform(list1, x -> x - list1_avg)")) \
.withColumn("list2", F.expr("transform(list2, x -> x - list2_avg)")) \
.drop("list1_avg", "list2_avg")
df1.show(truncate=False)
#+---+-------------------------------------------------------------+-------------------------------------------------------------+
#|id |list1 |list2 |
#+---+-------------------------------------------------------------+-------------------------------------------------------------+
#|1 |[-10.0, 0.0, 10.0] |[-10.0, 0.0, 10.0] |
#|2 |[-26.666666666666664, 3.3333333333333357, 23.333333333333336]|[-6.666666666666668, -16.666666666666668, 23.333333333333332]|
#+---+-------------------------------------------------------------+-------------------------------------------------------------+