Работа с NULL-значениями в PySpark
na.fill() для заполнения пропусков, dropna() для удаления строк с null, na.replace() для замены значений, filter()/where() для фильтрации по null-условиям.
Работа с пропущенными значениями — одна из самых распространённых задач в инженерии данных. PySpark предоставляет несколько удобных функций для очистки, замены и удаления null-значений.
1. na.fill() — заполнение пропущенных значений¶
Заполняет пропущенные значения конкретным значением.
df = spark.createDataFrame([
(1, None, "A"),
(2, 20, None),
(3, None, "C")
], ["id", "age", "category"])
df_filled = df.na.fill({
"age": 0,
"category": "Unknown"
})
df_filled.show()
Вывод:
+---+---+--------+
| id|age|category|
+---+---+--------+
| 1| 0| A|
| 2| 20| Unknown|
| 3| 0| C|
+---+---+--------+
2. dropna() — удаление строк с null¶
df_dropped = df.dropna() # удаляет строки с ЛЮБЫМ null
df_dropped.show()
Вывод:
+---+---+--------+
| id|age|category|
+---+---+--------+
| 2| 20| None|
+---+---+--------+
Удалить строку только если ВСЕ значения null:
df.dropna(how="all")
Удалить, если null присутствует в конкретных колонках:
df.dropna(subset=["age"])
3. na.replace() — замена конкретных значений¶
Заменяет конкретные значения (не только null):
df_replace = df.na.replace({
"A": "Category-A",
"C": "Category-C"
})
df_replace.show()
Вывод:
+---+----+-----------+
| id| age| category|
+---+----+-----------+
| 1|null| Category-A|
| 2| 20| null|
| 3|null| Category-C|
+---+----+-----------+
4. where() / filter() — фильтрация по null-условиям¶
where() и filter() функционально идентичны в PySpark.
Фильтрация строк, где колонка НЕ равна null:
df_filtered = df.where(df.age.isNotNull())
df_filtered.show()
Вывод:
+---+---+--------+
| id|age|category|
+---+---+--------+
| 2| 20| None|
+---+---+--------+
Фильтрация строк, где колонка равна null:
df.where(df.category.isNull()).show()
Фильтрация с SQL-стилем условия:
df.filter("age IS NOT NULL AND category IS NOT NULL").show()
Фильтрация после заполнения null:
df.na.fill({"age": 0}).where("age > 0").show()
Итог¶
| Функция | Назначение |
|---|---|
na.fill() |
Заполнение пропущенных значений константами |
dropna() |
Удаление строк с null-значениями |
na.replace() |
Замена конкретных значений в DataFrame |
where() / filter() |
Фильтрация строк по условиям (с поддержкой null) |
Лучшие практики¶
- Используйте
dropna()осторожно — можно потерять важные данные - Для числовых колонок применяйте
na.fill()с0или средним значением - Для строковых колонок применяйте
na.fill()со значением"Unknown" - Используйте
na.replace()для исправления значений (не только null) - Применяйте
where()/filter()когда нужен условный контроль, а не слепое удаление данных