Повторение строки на основе значения столбца (например, умножение строки и числа в Python) - PullRequest
1 голос
/ 06 марта 2019

У меня есть следующий фрейм данных (называемый df) со столбцами item_name и item_level:

   item_name    item_level 
----------------------------
   Item1              1
   Item2              2
   Item3              2
   Item4              3

Я хотел бы создать новый столбец, который производит отступ элементов, в зависимости отна их уровне.Чтобы сделать это, я бы хотел умножить item_level на строку '---', с мыслью, что когда я это делаю, строка соединяется сама с собой столько раз, сколько значение целого числа, на которое я умножаю строку.

Мой желаемый результат примерно такой:

  item_name    item_level      new_column
------------------------------------------------
   Item1            1            ---Item1
   Item2            2            ------Item2
   Item3            2            ------Item3
   Item4            3            ---------Item4

В pyspark, когда я пишу следующую команду, созданный столбец содержит только null значения:

from pyspark.sql import functions as F
df = df.withColumn('new_column',F.concat(F.lit(df.item_level*'---'),df.item_name))

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * К к-т Значение null, кажется, происходит из умножения целых чисел на строку.Кажется, функция concat работает правильно.Например, следующие работы:

df = df.withColumn('new_column',F.concat(df.item_name,df.item_name))

Я также попробовал несколько других вещей.Если я использую постоянное число для умножения строки, результирующая строка отображается следующим образом:

number = 3
df = df.withColumn('new_column', F.lit(number*'---'))

Кроме того, добавление строки '---' первой в столбце (с одинаковыми строками '---'), а затем умножение этого столбца на столбец item_level также дает нулевые значения:

df = df.withColumn('padding',F.lit('---'))
df = df.withColumn('test',df.padding*df.item_name)

Однако, если я использую панд, этот последний фрагмент кода делает то, что я хочу.Но мне нужно сделать это в pyspark.

1 Ответ

1 голос
/ 06 марта 2019

Есть функция pyspark.sql.functions.repeat, которая:

Повторяет строковый столбец n раз и возвращает его как новый строковый столбец.

Объедините результат repeat с item_name, как вы делали в своем коде. Единственная проблема заключается в том, что вам нужно использовать pyspark.sql.functions.expr, чтобы передать значение столбца в качестве аргумента функции искры .

from pyspark.sql.functions import concat, expr

df.withColumn(
    "new_column", 
    concat(expr("repeat('---', item_level)"), "item_name")
).show()
#+---------+----------+--------------+
#|item_name|item_level|    new_column|
#+---------+----------+--------------+
#|    Item1|         1|      ---Item1|
#|    Item2|         2|   ------Item2|
#|    Item3|         2|   ------Item3|
#|    Item4|         3|---------Item4|
#+---------+----------+--------------+

Обратите внимание, что show() будет корректно отображать вывод, но базовые данные соответствуют желаемым.

...