首页 > 解决方案 > 根据列值重复一个字符串(如python中字符串和数字的乘法)

问题描述

我有以下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)

但是,如果我使用 pandas,则最后一段代码可以满足我的要求。但我需要在 pyspark 中执行此操作。

标签: pythonapache-sparkpysparkapache-spark-sqlstring-concatenation

解决方案


有一个功能pyspark.sql.functions.repeat

将字符串列重复 n 次,并将其作为新的字符串列返回。

将结果repeatitem_name您在代码中所做的一样。唯一的问题是您需要使用pyspark.sql.functions.expr它来将列值作为参数传递给 spark 函数

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()将正确证明显示的输出,但基础数据如您所愿。


推荐阅读