首页 > 解决方案 > PySpark DataFrame 根据其他列中的值乘以列

问题描述

Pyspark 新手在这里。我有一个数据框,比如说,

+------------+-------+----+
|          id|  mode|count|
+------------+------+-----+
|     146360 |   DOS|   30|
|     423541 |   UNO|    3|
+------------+------+-----+

我想要一个带有新列的数据框aggregatecount * 2模式是什么时候'DOS',模式是什么时候count * 1'UNO'

+------------+-------+----+---------+
|          id|  mode|count|aggregate|
+------------+------+-----+---------+
|     146360 |   DOS|   30|       60|
|     423541 |   UNO|    3|        3|
+------------+------+-----+---------+

感谢您的投入以及一些最佳实践的指导:)

标签: pysparkapache-spark-sql

解决方案


方法 1:使用pyspark.sql.functionswith when

from pyspark.sql.functions import when,col
df = df.withColumn('aggregate', when(col('mode')=='DOS', col('count')*2).when(col('mode')=='UNO', col('count')*1).otherwise('count'))

方法 2:使用 SQL CASE 表达式selectExpr

df = df.selectExpr("*","CASE WHEN mode == 'DOS' THEN count*2 WHEN mode == 'UNO' THEN count*1 ELSE count END AS aggregate")

结果:

+------+----+-----+---------+
|    id|mode|count|aggregate|
+------+----+-----+---------+
|146360| DOS|   30|       60|
|423541| UNO|    3|        3|
+------+----+-----+---------+

推荐阅读