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

如何在PySpark中反转DataFrame分类值的映射关系

解决方案

针对你的需求,有几种简洁的实现方式,以下是具体示例:

方法1:条件判断(when-otherwise)

适合固定值映射的场景,直接指定反转关系:

from pyspark.sql import functions as F

# 假设你的DataFrame名为df
df = df.withColumn(
    "value",
    F.when(F.col("value") == 1, 3)
     .when(F.col("value") == 3, 1)
     .otherwise(F.col("value"))
)

df.show()

方法2:最大值+最小值公式(通用型)

如果需要动态交换最大、最小值并保留中间值,无需硬编码具体数值:

from pyspark.sql import functions as F

# 计算value列的最大、最小值
value_stats = df.select(F.max("value").alias("max_val"), F.min("value").alias("min_val")).first()
max_val = value_stats["max_val"]
min_val = value_stats["min_val"]

# 通过公式实现反转:max_val + min_val - value
df = df.withColumn(
    "value",
    F.lit(max_val) + F.lit(min_val) - F.col("value")
)

df.show()

这个方法的优势是无需提前知晓具体value值,只要是交换最大最小值的场景都适用,比如value唯一值为2、5、8时,会自动完成2↔8、5保持不变的映射。

方法3:映射字典(create_map)

通过定义映射字典实现自定义反转:

from pyspark.sql import functions as F
from pyspark.sql.types import IntegerType

# 定义反转映射关系
reverse_map = {1:3, 3:1, 2:2}
# 创建映射表达式
map_expr = F.create_map(*[F.lit(item) for pair in reverse_map.items() for item in pair])

df = df.withColumn("value", map_expr[F.col("value")].cast(IntegerType()))

df.show()

运行任意一种方法后,都会得到目标结果:

+---+-----+
| id|value|
+---+-----+
|  1|    3|
|  2|    1|
|  3|    2|
|  4|    2|
|  5|    3|
+---+-----+

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:05:24