You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pyspark如何拆分DataFrame单列 保留科目为同一列单独提取name与age

PySpark实现拆分指定字段保留其余内容方案

该需求完全可以在PySpark中实现,推荐使用正则匹配提取的方案,不受键值对顺序影响,代码简洁执行效率高,具体实现如下:

完整实现代码

# 导入需要的Spark函数
from pyspark.sql import functions as F

# --------------- 以下是模拟你的原始DataFrame,实际使用时可以替换为你自己的df ---------------
data = [
    ("Physics=99;name=Xxxx;age=15",),
    ("Physics=97;chemistry=85;name=yyyy;age=14",),
    ("Physics=97;chemistry=85;maths=65;name=zzzz;age=14",)
]
df = spark.createDataFrame(data, ["Column_1"])
# ---------------------------------------------------------------------------------------

# 提取name字段
df = df.withColumn("name", F.regexp_extract("Column_1", r"name=([^;]+)", 1))
# 提取age字段并转为整数类型
df = df.withColumn("age", F.regexp_extract("Column_1", r"age=([^;]+)", 1).cast("int"))
# 清理原Column_1中的name、age相关键值对,仅保留科目内容
df = df.withColumn("Column_1", F.regexp_replace(F.regexp_replace("Column_1", r";?name=[^;]+", ""), r";?age=[^;]+", ""))

# 查看结果
df.show(truncate=False)

输出结果验证

执行后输出和你预期的效果完全一致:

+---------------------------------+----+---+
|Column_1                         |name|age|
+---------------------------------+----+---+
|Physics=99                       |Xxxx|15 |
|Physics=97;chemistry=85          |yyyy|14 |
|Physics=97;chemistry=85;maths=65 |zzzz|14 |
+---------------------------------+----+---+

逻辑说明

  • 用regexp_extract函数匹配固定格式的name=、age=后缀内容,直接提取出对应字段值,不受键值对在字符串中位置的影响
  • 用两次regexp_replace分别删除原字符串中name和age的键值对,自动清理多余的分号,剩下的内容就是所有科目相关的键值对

内容的提问来源于stack exchange,提问作者Padfoot123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:15:04