根据字符串列和其他列2和3 Pyspark UDF的条件转换两列

问题描述 投票:0回答:1

data table你好

我想将一些cm值(ref_low = 20和ref_low <40,&ref_high> 70和ref_high <90,)转换为使用公式(cm / 100)进行测量。我尝试使用Pyspark UDF

c_udf = udf(lambda val:val / 100,如果ref_low = 20而ref_low <40否则val)df = df.withColumn(“ new”,c_udf(“ ref_low”))。withColumn(“ new”,c_udf(“ ref_high”))]

问题1:如何向UDF添加单位= Cm?,并希望保留所有其他值。

谢谢

pyspark user-defined-functions multiple-conditions
1个回答
0
投票

我认为这就是您想要的。内置Spark when/otherwise就足够了。您只需要适当地表达布尔值即可。

from pyspark.sql import functions as F
df.withColumn("ref_low", F.when((F.col("unit")=='cm')&((F.col("ref_low")<40)|\
                                 (F.col("ref_low")==20)), F.col("ref_low")/100)\
             .otherwise(F.col("ref_low")))\
  .withColumn("ref_high", F.when((F.col("unit")=='cm')&((F.col("ref_high")<90)&\
                                  (F.col("ref_high")>70)),F.col("ref_high")/100)\
             .otherwise(F.col("ref_high"))).show()

#+-----+-------+--------+
#| unit|ref_low|ref_high|
#+-----+-------+--------+
#|   cm|    0.3|    50.0|
#|   cm|   40.0|    70.0|
#|   cm|    0.2|    0.85|
#|   cm|    0.2|    0.85|
#|   cm|    0.3|    0.76|
#|   cm|   43.0|    65.0|
#|Meter|    0.2|    0.65|
#|Meter|    0.4|    0.68|
#|Meter|    0.5|     0.8|
#+-----+-------+--------+
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.