【问题标题】:Repeating a string based on a column value (like multiplication of a string and a number in python)根据列值重复一个字符串(如 python 中字符串和数字的乘法)
【发布时间】:2019-03-06 14:46:44
【问题描述】:

我有以下数据框(称为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)

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

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql string-concatenation


    【解决方案1】:

    有一个函数pyspark.sql.functions.repeat

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

    repeat 的结果与item_name 连接起来,就像您在代码中所做的那样。唯一的问题是您需要使用pyspark.sql.functions.expr 才能使用pass a column value as an argument to a spark function

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

    【讨论】:

    • 非常感谢!这实际上完成了工作!我一直在努力寻找正确的方法,这是完美的!
    • 我想让 new_column 变成一长串重复的“item_name”,而不是像“---”这样的字符串,但是当我用 item_name 替换“---”时会出错?跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    相关资源
    最近更新 更多