PySpark实现列值条件处理生成新列w的技术咨询
PySpark DataFrame 按规则生成新列w的解决方案
先明确示例输入与期望输出,直观展示需求:
示例输入
| x |
|---|
| <25 |
| 30+ |
| 35-40 |
| 28 |
期望输出
| x | w |
|---|---|
| <25 | 24.9 |
| 30+ | 30.0 |
| 35-40 | 35.0 |
| 28 | 28.0 |
实现代码
利用PySpark的when/otherwise条件分支,结合正则提取、字符串拆分函数即可完成规则处理:
from pyspark.sql import SparkSession from pyspark.sql.functions import when, regexp_extract, split, col # 初始化SparkSession spark = SparkSession.builder.appName("GenerateColumnW").getOrCreate() # 构造示例DataFrame data = [("<25",), ("30+",), ("35-40",), ("28",)] df = spark.createDataFrame(data, ["x"]) # 按规则生成新列w df_with_w = df.withColumn( "w", # 处理包含<的情况:提取数字后减0.1 when(col("x").contains("<"), regexp_extract(col("x"), r"(\d+)", 1).cast("double") - 0.1) # 处理包含+的情况:提取数字保留原数值 .when(col("x").contains("+"), regexp_extract(col("x"), r"(\d+)", 1).cast("double")) # 处理范围格式:拆分后取第一个数字 .when(col("x").contains("-"), split(col("x"), "-")[0].cast("double")) # 处理纯数字的默认情况 .otherwise(col("x").cast("double")) ) # 查看结果 df_with_w.show()
代码说明
- 正则提取逻辑:
regexp_extract(col("x"), r"(\d+)", 1)用于从字符串中匹配并提取连续数字,\d+匹配一个或多个数字,第三个参数1表示取第一个捕获组的内容。 - 条件分支顺序:规则之间无重叠,按需求顺序编写
when判断即可。 - 小数扩展支持:如果x列包含小数(如
<25.5、30.2+),可将正则表达式改为(\d+\.?\d*),即可匹配整数与小数格式。
内容的提问来源于stack exchange,提问作者Gaaaa
相关产品推荐
相关产品推荐

