PySpark: Как указать ось dropna в преобразовании PySpark?

Вопрос или проблема

Я хотел бы удалить столбцы, которые содержат только значения null, используя dropna(). В Pandas это можно сделать, установив аргумент ключевого слова axis="columns" в dropna(). Вот пример в посте на GitHub.

Как это сделать в PySpark? dropna() доступен как преобразование в PySpark, однако axis не является доступным ключевым словом.

Примечание: я не хочу транспонировать свой датафрейм, чтобы это работало.

Как мне удалить столбец мебели из этого датафрейма?

data_2 = { 'furniture': [np.NaN ,np.NaN ,np.NaN], 'myid': ['1-12', '0-11', '2-12'], 'clothing': ["pants", "shoes", "socks"]} 

df_1 = pd.DataFrame(data_2)
ddf_1 = spark.createDataFrame(df_1)
ddf_1.show() 

Я понимаю, что это немного запоздало, но я тоже с этим столкнулся. Это моя попытка удалить столбцы null из Spark Dataframe.

from pyspark.sql.functions import when, isnull

colsthatarenull = df.select([(when(isnull(c), c)).alias(c) for c in df.columns]).first().asDict()
namesofnullcols = {key:val for key, val in colsthatarenull.items() if val != None}.values()
df = df.drop(*namesofnullcols)

Вы должны иметь возможность использовать имя столбца, как:

df_1 = df_1.drop('furniture') 

Ответ или решение

В PySpark нет параметра axis, аналогичного тому, который существует в Pandas для метода dropna(). Вместо этого, чтобы удалить столбцы, содержащие только значения null, необходимо использовать другие подходы, такие как использование функций для анализа значений в столбцах и последующее их удаление.

Вы можете использовать функции isnull() и agg() в PySpark для определения столбцов, в которых все значения равны null. Ниже приведен пример того, как это можно реализовать.

  1. Создание образца данных. Для примера создадим DataFrame с пустым столбцом ‘furniture’:
import numpy as np
from pyspark.sql import SparkSession

# Инициализация Spark
spark = SparkSession.builder.appName("Drop Null Columns").getOrCreate()

# Создание DataFrame
data_2 = {'furniture': [np.NaN, np.NaN, np.NaN], 'myid': ['1-12', '0-11', '2-12'], 'clothing': ["pants", "shoes", "socks"]}
df_1 = spark.createDataFrame(data_2)
df_1.show()
  1. Определение пустых столбцов и их удаление. Вы можете использовать следующий код для удаления столбцов, содержаших только null значения:
from pyspark.sql.functions import col, when

# Определение списка имен столбцов, содержащих только null
null_columns = [c for c in df_1.columns if df_1.select(c).distinct().count() == 1 and df_1.select(c).first()[0] is None]

# Удаление пустых столбцов
df_1_cleaned = df_1.drop(*null_columns)

# Показ результата
df_1_cleaned.show()

Объяснение кода:

  • Используя метод distinct().count(), мы проверяем, есть ли хотя бы одно ненулевое значение для каждого столбца.
  • Мы используем условие first()[0] is None, чтобы убедиться, что это значение действительно null.
  • drop(*null_columns) позволяет удалить все столбцы, содержащие только null, передав их имена в метод drop.

Таким образом, вы можете эффективно удалить столбцы с нулевыми значениями в PySpark без необходимости транспонирования DataFrame. В результате, в нашем примере будет удален столбец ‘furniture’, оставив только ‘myid’ и ‘clothing’.

Оцените материал
Добавить комментарий

Капча загружается...