python - 如何根据 PySpark 数据框的另一列中的值修改列?F.当边缘情况
问题描述
我想浏览 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'))
推荐阅读
- c - 无法使用嵌入式 C 开发工具包连接 AWS 主机 URL
- php - 到 Heroku 的 Gitlab 存储库
- xcode - 苹果手表系列 3 或系列 5 用于开发设备?
- html - 无法从后面的代码中使用 html 控件
- wso2 - WSO2 - 无法将ViaPost 发送到 url
- oauth-2.0 - .NET Core 3.1 IdentityServer4:使用资源所有者密码凭据授予时获取无效访问令牌
- mysql - 在进行开发时查询未在生产中执行
- laravel - 将数据行转换为 1 个对象
- clickhouse - ClickHouse 耐用吗?
- xamarin.forms - 将数据从 Share Extension 发送到 Xamatin.Forms 应用程序