Быстрый способ удалить пустой столбец [PySpark]

Есть ли простой способ удалить пустой столбец огромного набора данных (300+ столбцов> 100 тыс. строк) в pyspark? например df.dropna(axis=1,how='all') в Python


person Vaquez Vincent    schedule 29.10.2019    source источник


Ответы (1)


Да, вы можете просто использовать ответ из здесь. Я добавил к нему параметр threshold:

import pyspark.sql.functions as F

# Sample data
df = pd.DataFrame({'x1': ['a', '1', '2'],
                   'x2': ['b', None, '2'],
                   'x3': ['c', '0', '3'] })
df = sqlContext.createDataFrame(df)
df.show()

def drop_null_columns(df, threshold=0):
    """
    This function drops all columns which contain null values.
    :param df: A PySpark DataFrame
    """
    null_counts = df.select([F.count(F.when(F.col(c).isNull(), c)).alias(c) for c in df.columns]).collect()[0].asDict()
    to_drop = [k for k, v in null_counts.items() if v > threshold]
    df = df.drop(*to_drop)
    return df

# Drops column b2, because it contains null values
drop_null_columns(df).show()

Выход

+---+---+
| x1| x3|
+---+---+
|  a|  c|
|  1|  0|
|  2|  3|
+---+---+

Столбец x2 удален.

Вы можете использовать threshold=df.count() во время его использования

person pissall    schedule 30.10.2019
comment
Как изменить функцию, чтобы удалить столбец, только если все записи имеют значение null/nan/пустая строка? - person MachineLearner; 07.05.2020
comment
@MachineLearner Вот ссылка для вас: stackoverflow.com/a/51325114/8805315 - person pissall; 07.05.2020
comment
Спасибо за предоставленную ссылку. Но предоставленное решение избавляется от второго столбца, который не только состоит из нуля, но и содержит другие значения. Я хочу удалить столбец только тогда и только тогда, когда все строки имеют значение null/nan/пусто. - person MachineLearner; 07.05.2020
comment
@MachineLearner позволь мне сделать это за тебя - person pissall; 07.05.2020
comment
Извините, я имел в виду тогда и только тогда, когда все строки равны null/nan/emtpy. - person MachineLearner; 07.05.2020