如何在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
相关产品推荐
相关产品推荐

