pyspark заменяет несколько значений на ноль в датафрейме

У меня есть датафрейм (df) и в рамках этого фрейма у меня есть столбец user_id

df = sc.parallelize([(1, "not_set"),
                     (2, "user_001"),
                     (3, "user_002"),
                     (4, "n/a"),
                     (5, "N/A"),
                     (6, "userid_not_set"),
                     (7, "user_003"),
                     (8, "user_004")]).toDF(["key", "user_id"])

ДФ:

+---+--------------+
|key|       user_id|
+---+--------------+
|  1|       not_set|
|  2|      user_003|
|  3|      user_004|
|  4|           n/a|
|  5|           N/A|
|  6|userid_not_set|
|  7|      user_003|
|  8|      user_004|
+---+--------------+

Я хотел бы заменить следующие значения: not_set, n / a, N / A и userid_not_set на null.

Было бы хорошо, если бы я мог добавить какие-либо новые значения в список, и их можно было бы изменить.

В настоящее время я использую оператор CASE в пределах spark.sql, чтобы это сделать, и хотел бы изменить его на pyspark.

3 ответа

Решение

None внутри when() функция соответствует null, В случае, если вы хотите заполнить что-нибудь еще вместо null, Вы должны заполнить его в своем месте.

from pyspark.sql.functions import col    
df =  df.withColumn(
    "user_id",
    when(
        col("user_id").isin('not_set', 'n/a', 'N/A', 'userid_not_set'),
        None
    ).otherwise(col("user_id"))
)
df.show()
+---+--------+
|key| user_id|
+---+--------+
|  1|    null|
|  2|user_001|
|  3|user_002|
|  4|    null|
|  5|    null|
|  6|    null|
|  7|user_003|
|  8|user_004|
+---+--------+

Вы можете использовать встроенный when функция, которая является эквивалентом case выражение.

from pyspark.sql import functions as f
df.select(df.key,f.when(df.user_id.isin(['not_set', 'n/a', 'N/A']),None).otherwise(df.user_id)).show()

Также необходимые значения могут быть сохранены в list и быть ссылки.

val_list = ['not_set', 'n/a', 'N/A']
df.select(df.key,f.when(df.user_id.isin(val_list),None).otherwise(df.user_id)).show()

ПФБ мало подходит. Я предполагаю, что все законные идентификаторы пользователей начинаются с "user_", Пожалуйста, попробуйте ниже код.

from pyspark.sql.functions import *
df.withColumn(
    "user_id",
    when(col("user_id").startswith("user_"),col("user_id")).otherwise(None)
).show()

Другой.

cond = """case when user_id in ('not_set', 'n/a', 'N/A', 'userid_not_set') then null
                else user_id
            end"""

df.withColumn("ID", expr(cond)).show()

Другой.

cond = """case when user_id like 'user_%' then user_id
                else null
            end"""

df.withColumn("ID", expr(cond)).show()

Другой.

df.withColumn(
    "user_id",
    when(col("user_id").rlike("user_"),col("user_id")).otherwise(None)
).show()
Другие вопросы по тегам