如果在pyspark中为了折叠列值

Shw*_*ble 1 if-statement conditional-statements dataframe pyspark

我正在尝试一个简单的代码,在索引之后将数据框中的分类变量折叠为二进制类,目前我的列有3个类 - "A","B","C"我正在编写一个简单的if else语句来折叠类

def condition(r):
if (r.wo_flag=="SLM" or r.wo_flag=="NON-SLM"):
    r.wo_flag="dispatch" 
else: 
    r.wo_flag="non_dispatch" 
return r.wo_flag 

df_final=df_new.map(lambda x: condition(x)) 
Run Code Online (Sandbox Code Playgroud)

它不工作它不理解其他条件

|MData|Recode12|Status|DayOfWeekOfDispatch|MannerOfDispatch|Wo_flag|PlaceOfInjury|Race|
     M|      11|     M|                  4|               7|      C|           99| 1  |    
     M|       8|     D|                  3|               7|      A|           99| 1  |
     F|      10|     W|                  2|               7|      C|           99| 1  |
     M|       9|     D|                  1|               7|      B|           99| 1  |
     M|       8|     D|                  2|               7|      C|           99| 1  |
Run Code Online (Sandbox Code Playgroud)

这是样本数据

Him*_*oon 8

试试这个 :

from pyspark.sql.types import StringType
from pyspark.sql.functions import udf

def modify_values(r):
    if r == "A" or r =="B":
        return "dispatch"
    else:
        return "non-dispatch"
ol_val = udf(modify_values, StringType())
new_df = df.withColumn("wo_flag",ol_val(df.wo_flag))
Run Code Online (Sandbox Code Playgroud)

你做错了什么:

  • 你试图修改行(行是不可改变的)
  • 在数据帧上执行映射操作时,生成的数据结构是PipelinedRDD而不是数据帧.您必须应用.toDF()来获取数据帧


mcs*_*ner 7

由于使用了用户定义函数 (UDF),接受的答案不是很有效。

我想大多数人都在寻找when.

from pyspark.sql.functions import when

matches = df["wo_flag"].isin("SLM", "NON-SLM")
new_df = df.withColumn("wo_flag", when(matches, "dispatch").otherwise("non-dispatch"))
Run Code Online (Sandbox Code Playgroud)