根据列值重复一个字符串(例如字符串的乘法和python中的数字)



i具有以下数据框(称为df),带有item_nameitem_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中做到这一点。

有一个函数 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()将正确证明显示的输出是合理的,但是基础数据是根据您所需的。

最新更新