PySpark:将DataFrame中分号分隔的数组列转换为指定格式
解决PySpark DataFrame分号分隔字符串转编号列表问题
你的核心问题是未对分号分隔的字符串做拆分和编号处理,只是直接拼接原字符串,所以结果仍保留分号格式。以下是具体解决方法:
处理逻辑拆解
- 拆分字符串:将分号分隔的字符串拆分为单个元素的数组,同时兼容分号前后的空格差异
- 添加编号:给数组内每个元素加上带括号的序号(如(1)、(2))
- 拼接目标格式:将编号后的元素用换行符连接,再加上指定前缀
完整代码实现
假设prefix_var为固定前缀(比如示例中的"Statements"),处理多列的代码如下:
from pyspark.sql import functions as F prefix_var = "Statements" # 遍历第3列及以后的所有目标列 for dis_col in dissss_data.columns[2:]: dissss_data = dissss_data.withColumn( dis_col, F.when( F.col(dis_col) != "", # 拼接前缀与处理后的内容 F.concat( F.lit(f"{prefix_var}: \n"), # 将编号后的数组元素用换行符连接成字符串 F.array_join( # 遍历拆分后的数组,为每个元素添加序号 F.transform( # 先去除字符串首尾空格,再按"分号+任意空格"拆分 F.split(F.trim(F.col(dis_col)), r";\s*"), lambda elem, idx: F.format_string("(%d) %s", idx + 1, elem) ), "\n" ) ) ).otherwise(F.col(dis_col)) # 空字符串保持原始状态 )
数组类型列的特殊处理
如果目标列确实是数组类型(数组仅包含一个分号分隔的字符串元素),只需修改拆分前的取值逻辑,将F.trim(F.col(dis_col))替换为F.trim(F.col(dis_col)[0])即可:
F.split(F.trim(F.col(dis_col)[0]), r";\s*")
代码细节说明
F.trim():去除字符串首尾空格,避免拆分后出现空元素F.split(..., r";\s*"):用正则匹配分号及后续任意空格,兼容分号后空格数量不统一的场景F.transform():遍历数组元素,结合索引生成带编号的字符串F.array_join():将数组元素用换行符连接成单个字符串F.concat():将前缀与处理后的内容拼接成最终格式
内容的提问来源于stack exchange,提问作者aditG23
相关产品推荐
相关产品推荐

