删除空列的快速方法 [PySpark]

Posted

技术标签:

【中文标题】删除空列的快速方法 [PySpark]【英文标题】:Quick way to delete empty column [PySpark] 【发布时间】:2019-10-29 14:30:05 【问题描述】:

有没有一种简单的方法可以在 pyspark 中删除一个巨大数据集(300+ col >100k 行)的空列?比如Python中的df.dropna(axis=1,how='all')

【问题讨论】:

【参考方案1】:

是的,您可以简单地使用来自here 的答案。我添加了一个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()

【讨论】:

如果所有条目都是null/nan/空字符串,如何更改删除列的功能? @MachineLearner 这是给你的链接:***.com/a/51325114/8805315 感谢您提供的链接。但是提供的解决方案摆脱了第二列,该列不仅包含 null,而且还包含其他值。当且仅当所有行都为 null/nan/empty 时,我只想删除该列。 @MachineLearner 让我为你做这些 对不起,我的意思是当且仅当所有行都是 null/nan/emtpy。【参考方案2】:

这是 @pissall 的 fn 的扩展功能:

def drop_null_columns(df, threshold=-1):
    """
    This function drops all columns which contain null values.
    If threshold is negative (default), drop columns that have only null values.
    If threshold is >=0, drop columns that have count of null values bigger than threshold. This may be very computationally expensive!
    Returns PySpark DataFrame.
    """
    if threshold<0:
        max_per_column = df.select([F.max(c).alias(c) for c in df.columns]).collect()[0].asDict()
        to_drop = [k for k, v in max_per_column.items() if v == None]
    else:
        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

【讨论】:

以上是关于删除空列的快速方法 [PySpark]的主要内容,如果未能解决你的问题,请参考以下文章

从 pyspark 数据框中删除空列

如何根据另一列的值创建空列或非空列?

Pyspark 熔化空列

在 PySpark DataFrame 中添加多个空列

[No0000C1]Excel 删除空白行和空白列VBA代码

带有点“。”的数据框的 pyspark 访问列