Как я могу создать столбец кортежа из другого столбца? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть столбец с оценками, и я хочу создать столбец групп для этой оценки.

Пример: счет 623 должен иметь столбец со значением (600, 625].

В Python я делал это так:

df['score_band_25'] = df['score'].apply(lambda x: '('+str((int((x-0.1)//25)*25))+', '+str(int((x-0.1)//25)*25+25)+']')

Как я могу сделать это в Scala? Лучшее, что я мог придумать, было:

.withColumn("score_band_25", floor(($"score"-0.1)/25)*25)

но это дает мне только первую часть кортежа, и я не могу найти способ объединить floor(($"score"-0.1)/25)*25) и floor(($"score"-0.1)/25)*25+25) в строки.

В идеале я хотел бы, чтобы в начале у меня было (, а в конце - ], но я был бы рад и двум (600, 625).

1 Ответ

0 голосов
/ 06 сентября 2018

Если я правильно понимаю ваше требование, вы пытаетесь создать столбец типа String с полуоткрытыми интервалами, соответствующими значениям столбца Integer - в этом случае вы можете просто использовать concat() объединить расчетные пределы интервала:

import org.apache.spark.sql.functions._

val df = Seq(
  12, 149, 300, 623
).toDF("score")

val interval = 25

df.withColumn("score_band_" + interval, concat(
  lit("("),
  floor(($"score" - 0.1) / interval) * interval,
  lit(", "),
  floor(($"score" - 0.1) / interval) * interval + interval,
  lit("]")
)).show
// +-----+-------------+
// |score|score_band_25|
// +-----+-------------+
// |   12|      (0, 25]|
// |  149|   (125, 150]|
// |  300|   (275, 300]|
// |  623|   (600, 625]|
// +-----+-------------+

Обратите внимание, что concat принимает параметры типа Column, поэтому lit() требуется для буквенных строк (например, "(").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...