找到密集向量的最大值,将其设置为1,将所有其余值设置为0 [pyspark]

时间:2017-08-31 15:11:15

标签: python apache-spark dataframe pyspark

我有一个包含密集向量的DataFrame列。我想将这些向量的最大值设置为1,并将所有其余值替换为0。 例如:

+------+-------------+
|  Col1|       vector|
+------+-------------+
|Modali|[1.0,2.0,3.0]|
|assert|[4.0,9.0,3.0]|
+------+-------------+

我想把它变成:

+------+-------------+
|  Col1|       vector|
+------+-------------+
|Modali|[0.0,0.0,1.0]|
|assert|[0.0,1.0,0.0]|
+------+-------------+

请注意,我正在使用python在spark 2.1.0上工作。 非常感谢你。

1 个答案:

答案 0 :(得分:2)

您可以创建一个udf,它接收一个向量并将其二值化;可以通过使用列表解析简单地检查向量中的值是否等于最大值来构造二进制化器:

from pyspark.ml.linalg import Vectors, VectorUDT
import pyspark.sql.functions as F

def max_binarizer(vector):
    max_val = max(vector)                              # maximum value in the vector
    return Vectors.dense([1 if x == max_val else 0 for x in vector])    # binarize it

# create a udf for the binarizer
max_bin_udf = F.udf(max_binarizer, VectorUDT())

df.withColumn("vector", max_bin_udf(df["vector"])).show()
+------+-------------+
|  Col1|       vector|
+------+-------------+
|Modali|[0.0,0.0,1.0]|
|assert|[0.0,1.0,0.0]|
+------+-------------+