python - 根据列值重复一个字符串(如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 中执行此操作。
解决方案
有一个功能pyspark.sql.functions.repeat
:
将字符串列重复 n 次,并将其作为新的字符串列返回。
将结果repeat
与item_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()
将正确证明显示的输出,但基础数据如您所愿。
推荐阅读
- angular - ngx-webcam 如何识别用户是否允许网络摄像头权限 - Angular 4+
- docker - docker-compose up 不重新创建容器
- php - 如何使用 jquery 循环获取 3 个数据
- excel - How to transpose all subfields in front of the parent field of a pivot table in Excel
- python - django 中的字段级权限
- java - 尝试从 LAN 网络上的不同 pc 获取 db 备份会生成空 sql 文件
- c# - 将 varchar-Value '..' 转换为 int-Datatype 时出错
- networking - 在通过 VPN 连接的客户端上接收特定的多播消息
- spring - 无法重定向到 web-inf 文件夹。找不到资源
- image - 避免对相同图像进行不必要的 http 请求 - vuejs