Как я могу заменить значение, если нет в списке? - PullRequest
0 голосов
/ 27 мая 2019

У меня есть список со всеми значениями в столбце, и мне нужно заменить все значения, которых нет в этом списке, на 1

Я пробовал это

uniq = X_train3.select('street').distinct().collect()
X_test3 = X_test3.withColumn('street', F.when(array_contains('street', uniq), 1))

ия также пробовал это:

uniq = X_train3.select('street').distinct().collect()
X_test3 = X_test3.withColumn('street', F.when(~col('street').isin(uniq), 1))

оба приводят к этой ошибке: java.lang.RuntimeException: неподдерживаемый литеральный тип класса java.util.ArrayList [[1.0]]

Это то, что ясделал в питоне и работает:

uniq = X_train3[cl].unique()
uniq = uniq.tolist()
X_test3['street'] = X_test3['street'].map(lambda x: 1 if x not in uniq else x)]

1 Ответ

0 голосов
/ 27 мая 2019

Вы можете сделать это (в Scala напишите эквивалентный pyspark):

val new_X_test3 = X_test3
.join(X_train3
    .select("street")
    .distinct()
    .withColumnRenamed("street","street_train"), 
    col("street") === col("street_train"), 
    "leftouter")
.withColumn("street_test", 
    when(col("street_train").isNull, lit("1"))
    .otherwise(col("street")))
.drop("street","street_train")
.withColumnRenamed("street_test","street")

Также, если вы уверены, что список уникальных улиц очень мал (так как вы пытались собрать его в драйвере в своем коде), вы можете предоставить подсказку broadcast около X_train3. Таким образом, код становится:

val new_X_test3 = X_test3
.join(broadcast(X_train3
    .select("street")
    .distinct()
    .withColumnRenamed("street","street_train")), 
    col("street") === col("street_train"), 
    "leftouter")
.withColumn("street_test", 
    when(col("street_train").isNull, lit("1"))
    .otherwise(col("street")))
.drop("street","street_train")
.withColumnRenamed("street_test","street")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...