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()