我想遍历pyspark数据框中的每一行,并根据另一列的内容更改一列的值。我将其更改为的值也基于要更改的列的当前值。
具体来说,我有一列包含DenseVectors,另一列包含所需向量的索引。
或者,我也可以将DenseVector替换为DenseVector中两个值中的较大者。
我主要是尝试将F.when()与withColumn结合使用,但是由于要存储向量的正确索引,因此我遇到了F.when()第二个元素的麻烦,但无法直接在列上建立索引。
a b
1 DenseVector([0.1, 0.9]) 1.0
2 DenseVector([0.6, 0.4]) 0.0
.
.
.
df = df.withColumn('a', F.when(df.b == 0.0, df.a[0])
.otherwise(df.a[1])
答案 0 :(得分:1)
通过遵循this question的答案中找到的信息,我能够得出解决方案。
Spark中似乎存在一个错误,该错误不允许您对Spark数据帧中包含的DenseVectors进行索引。这可以通过创建一个用户定义的函数来解决,该函数可以访问诸如numpy数组之类的元素。
from pyspark.sql import functions as F
from pyspark.sql import types as T
firstelement=F.udf(lambda v:float(v[0]),T.FloatType())
secondelement=F.udf(lambda v:float(v[1]),T.FloatType())
df = df.withColumn('a', F.when(df['b'] == 0.0,
firstelement('a')).otherwise(secondelement('a'))