【问题标题】:How to drop all columns with null values in a PySpark DataFrame?如何在 PySpark DataFrame 中删除所有具有空值的列?
【发布时间】:2018-12-21 16:14:37
【问题描述】:

我有一个大型数据集,我想删除其中包含 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,因为其中一个值为空。

【问题讨论】:

标签: python apache-spark pyspark apache-spark-sql


【解决方案1】:

这是删除所有具有 NULL 值的列的一种可能方法:请参阅 here 获取有关对每列计数 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|
+---+---+

希望这会有所帮助!

【讨论】:

  • 是的,先生!它确实有帮助。多漂亮 !其他 3 条较早的行也运行良好
  • 很高兴我能帮上忙!我删除了阈值部分,可能会让未来偶然发现这个问题的人感到困惑。
  • @Florian 你应该保留阈值部分,它使它成为一个完整的答案!真的很有帮助,谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 2021-12-12
相关资源
最近更新 更多