繁体   English   中英

如何根据 PySpark 数据帧的另一列中的值修改列? F.when 边缘情况

[英]How to modify a column based on the values in another column of a PySpark dataframe? F.when edge case

我想遍历 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])

我能够通过遵循在这个问题的答案中找到的信息得出一个解决方案。

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'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM