Работа с NULL-значениями в PySpark

na.fill() для заполнения пропусков, dropna() для удаления строк с null, na.replace() для замены значений, filter()/where() для фильтрации по null-условиям.

core

Работа с пропущенными значениями — одна из самых распространённых задач в инженерии данных. 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() когда нужен условный контроль, а не слепое удаление данных