Вопрос или проблема
Я хотел бы удалить столбцы, которые содержат только значения 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
. Ниже приведен пример того, как это можно реализовать.
- Создание образца данных. Для примера создадим 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()
- Определение пустых столбцов и их удаление. Вы можете использовать следующий код для удаления столбцов, содержаших только
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’.