Как сделать regexp_replace в одну строку в фрейме pyspark? - PullRequest
1 голос
/ 16 апреля 2020

У меня есть столбец данных pyspark

df.groupBy('Gender').count().show()
(5) Spark Jobs
+------+------+
|Gender| count|
+------+------+
|     F| 44015|
|  null| 42175|
|     M|104423|
|      |     1|
+------+------+

Я выполняю regexp_replace

#df = df.fillna({'Gender':'missing'})
df = df.withColumn('Gender', regexp_replace('Gender', 'F','Female'))
df = df.withColumn('Gender', regexp_replace('Gender', 'M','Male'))
df = df.withColumn('Gender', regexp_replace('Gender', ' ','missing'))

Вместо вызова df для каждой строки, это можно сделать в одной строке?

1 Ответ

1 голос
/ 16 апреля 2020

Если вы не хотите использовать regexp_replace 3 раза , вы можете использовать when/otherwise предложение.

from pyspark.sql import functions as F
from pyspark.sql.functions import when

df.withColumn("Gender", F.when(F.col("Gender")=='F',F.lit("Female"))\
              .when(F.col("Gender")=='M',F.lit("Male"))\
              .otherwise(F.lit("missing"))).show()

+-------+------+
| Gender| count|
+-------+------+
| Female| 44015|
|missing| 42175|
|   Male|104423|
|missing|     1|
+-------+------+

Или вы могли бы сделать ваши три regexp_replace в одну строку, как это:

from pyspark.sql.functions import regexp_replace
df.withColumn('Gender', regexp_replace(regexp_replace(regexp_replace('Gender', 'F','Female'),'M','Male'),' ','missing')).show()

+-------+------+
| Gender| count|
+-------+------+
| Female| 44015|
|   null| 42175|
|   Male|104423|
|missing|     1|
+-------+------+

Я думаю, when/otherwise должен опередить 3 regexp_replace функций, потому что вам нужно будет использовать fillna с ними тоже.

...