如何在PySpark中实现对指定列的循环除法计算?
在PySpark中实现指定列除以coef列的计算
对应你用Pandas实现的循环将Age、CSP列除以coef列的逻辑,PySpark可以通过以下几种方式实现:
方法1:循环更新列(与Pandas逻辑对齐)
PySpark的DataFrame是不可变的,因此每次修改列都需要返回新的DataFrame。我们可以用withColumn方法循环处理每个目标列:
from pyspark.sql import SparkSession from pyspark.sql.functions import col # 初始化SparkSession spark = SparkSession.builder.appName("ColumnDivision").getOrCreate() # 构造原始数据并创建PySpark DataFrame data = { 'Name': ['Tom', 'nick', 'krish', 'jack'], 'Age': [20, 21, 19, 18], 'CSP': [2, 6, 8, 7], 'coef': [2, 2, 3, 3] } # 转换为Spark可接受的行格式并创建DataFrame df = spark.createDataFrame( [(data['Name'][i], data['Age'][i], data['CSP'][i], data['coef'][i]) for i in range(len(data['Name']))], schema=['Name', 'Age', 'CSP', 'coef'] ) # 指定需要计算的列 colsToRecalculate = ['Age', 'CSP'] # 循环处理每个列,替换为除以coef后的结果 for col_name in colsToRecalculate: df = df.withColumn(col_name, col(col_name) / col("coef")) # 查看计算结果 df.show()
运行后输出:
+-----+----+------------------+----+ | Name| Age| CSP|coef| +-----+----+------------------+----+ | Tom|10.0| 1.0| 2| | nick|10.5| 3.0| 2| |krish|6.333333333333333|2.6666666666666665| 3| | jack| 6.0|2.3333333333333335| 3| +-----+----+------------------+----+
方法2:使用selectExpr批量处理(更简洁)
如果不想写循环,可以用selectExpr通过表达式批量生成列逻辑,代码更紧凑:
# 重新创建原始DataFrame df = spark.createDataFrame( [(data['Name'][i], data['Age'][i], data['CSP'][i], data['coef'][i]) for i in range(len(data['Name']))], schema=['Name', 'Age', 'CSP', 'coef'] ) # 构造选择表达式:对目标列执行除法,其他列保持原样 exprs = [ f"{col} / coef as {col}" if col in colsToRecalculate else col for col in df.columns ] # 应用表达式并生成新DataFrame df = df.selectExpr(*exprs) df.show()
这段代码会得到和方法1完全一致的结果,适合列数较多的场景。
关键注意点
PySpark DataFrame是不可变对象,所有修改操作都会返回新的DataFrame,这和Pandas中直接修改原DataFrame的行为不同,需要注意变量的重新赋值。
内容的提问来源于stack exchange,提问作者Joel AMEDON
相关产品推荐
相关产品推荐

