Как изменить значения в фрейме данных PySpark, основываясь на условии того же столбца? - PullRequest
0 голосов
/ 21 апреля 2019

Рассмотрим пример кадра данных:

df = 
+-------+-----+
|   tech|state|
+-------+-----+
|     70|wa   |
|     50|mn   |
|     20|fl   |
|     50|mo   |
|     10|ar   |
|     90|wi   |
|     30|al   |
|     50|ca   |
+-------+-----+

Я хочу изменить столбец 'tech' так, чтобы любое значение 50 было изменено на 1, а все остальные значения равны 0.

Вывод будет выглядеть так:

df = 
+-------+-----+
|   tech|state|
+-------+-----+
|     0 |wa   |
|     1 |mn   |
|     0 |fl   |
|     1 |mo   |
|     0 |ar   |
|     0 |wi   |
|     0 |al   |
|     1 |ca   |
+-------+-----+

Вот что у меня есть:

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


changing_column = 'tech'
udf_first = UserDefinedFunction(lambda x: 1, IntegerType())
udf_second = UserDefinedFunction(lambda x: 0, IntegerType())
first_df = zero_df.select(*[udf_first(changing_column) if column == 50 else column for column in zero_df])
second_df = first_df.select(*[udf_second(changing_column) if column != 50 else column for column in first_df])
second_df.show()

1 Ответ

1 голос
/ 21 апреля 2019

надеюсь, это поможет

from pyspark.sql.functions import when

df = spark\
.createDataFrame([\
    (70, 'wa'),\
    (50, 'mn'),\
    (20, 'fl')],\
    ["tech", "state"])

df\
.select("*", when(df.tech == 50, 1)\
        .otherwise(0)\
        .alias("tech"))\
.show()

+----+-----+----+
|tech|state|tech|
+----+-----+----+
|  70|   wa|   0|
|  50|   mn|   1|
|  20|   fl|   0|
+----+-----+----+
...