如何根据另一列值的两个条件设置pyspark列的值

ippsafx7  于 2021-07-09  发布在  Spark
关注(0)|答案(2)|浏览(336)

假设我有一个Dataframe:

+-----+-----+-----+
|id   |foo. |bar. |
+-----+-----+-----+
|    1|  baz|    0|
|    2|  baz|    0|
|    3|  333|    2|
|    4|  444|    1|
+-----+-----+-----+

我想根据bar的值将foo列设置为一个值。
如果bar为2:将该行的foo值设置为“x”,
else if bar为1:将该行的foo值设置为“y”
如果两个条件都不满足,则保持foo值不变。
pyspark.when似乎是最接近的方法,但基于另一个columns值,它似乎不起作用。

6bc51xsx

6bc51xsx1#

我们可以用 when òr UDF 在spark中根据情况插入新的列。
创建示例Dataframe:

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('AddConditionalColumn').getOrCreate()

data = [(1,"baz",0),(2,"baz",0),(3,"333",2),(4,"444",1)]

columns = ["id","foo","bar"]
df = spark.createDataFrame(data = data, schema = columns)
df.show()

+---+---+---+
| id|foo|bar|
+---+---+---+
|  1|baz|  0|
|  2|baz|  0|
|  3|333|  2|
|  4|444|  1|
+---+---+---+

使用时间:

from pyspark.sql.functions import when
df2 = df.withColumn("foo", when(df.bar == 2,"X")
                           .when(df.bar == 1,"Y")
                           .otherwise(df.foo))
df2.show()

+---+---+---+
| id|foo|bar|
+---+---+---+
|  1|baz|  0|
|  2|baz|  0|
|  3|  X|  2|
|  4|  Y|  1|
+---+---+---+

使用自定义项:

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

def executeRule(value):
    if value == 2:
        return 'X'
    elif value == 1:
        return 'Y'
    else:
        return value

# Converting function to UDF

ruleUDF = F.udf(executeRule, StringType())
df3 = df.withColumn("foo", ruleUDF("bar"))
df3.show()

+---+---+---+
| id|foo|bar|
+---+---+---+
|  1|  0|  0|
|  2|  0|  0|
|  3|  X|  2|
|  4|  Y|  1|
+---+---+---+
2eafrhcq

2eafrhcq2#

when 可以与其他列一起使用。你可以用 F.col 要获取另一列的值并提供适当的条件,请执行以下操作:

import pyspark.sql.functions as F

df2 = df.withColumn(
    'foo', 
    F.when(F.col('bar') == 2, 'X')
     .when(F.col('bar') == 1, 'Y')
     .otherwise(F.col('foo'))
)

df2.show()
+---+---+---+
| id|foo|bar|
+---+---+---+
|  1|baz|  0|
|  2|baz|  0|
|  3|  X|  2|
|  4|  Y|  1|
+---+---+---+

相关问题