如何在PySpark DataFrame中删除具有空值的所有列?

发布于 2021-01-29 18:05:50

我有一个很大的数据集,我想删除包含null值的列并返回一个新的数据框。我怎样才能做到这一点?

以下内容仅删除包含的单个列或行null

df.where(col("dt_mvmt").isNull()) #doesnt work because I do not have all the columns names or for 1000's of columns
df.filter(df.dt_mvmt.isNotNull()) #same reason as above
df.na.drop() #drops rows that contain null, instead of columns that contain null

例如

a |  b  | c
1 |     | 0
2 |  2  | 3

在上述情况下,它将丢弃整个列,B因为其值之一为空。

关注者
0
被浏览
158
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是删除所有具有NULL值的所有列的一种可能的方法,以获取每列NULL值计数代码的源代码。

    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):
        """
        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 > 0]
        df = df.drop(*to_drop)
        return df
    
    # Drops column b2, because it contains null values
    drop_null_columns(df).show()
    

    之前:

    +---+----+---+
    | x1|  x2| x3|
    +---+----+---+
    |  a|   b|  c|
    |  1|null|  0|
    |  2|   2|  3|
    +---+----+---+
    

    后:

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

    希望这可以帮助!



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看