Pyspark数据框如何删除所有列中的空行?

Posted

技术标签:

【中文标题】Pyspark数据框如何删除所有列中的空行?【英文标题】:Pyspark dataframe how to drop rows with nulls in all columns? 【发布时间】:2018-01-12 15:05:47 【问题描述】:

对于一个数据框,之前是这样的:

+----+----+----+
|  ID|TYPE|CODE|
+----+----+----+
|   1|   B|  X1|
|null|null|null|
|null|   B|  X1|
+----+----+----+

我希望它是这样的:

+----+----+----+
|  ID|TYPE|CODE|
+----+----+----+
|   1|   B|  X1|
|null|   B|  X1|
+----+----+----+

我更喜欢一种通用的方法,这样它可以在df.columns 很长时应用。 谢谢!

【问题讨论】:

【参考方案1】:

na.drop 提供策略就是你所需要的:

df = spark.createDataFrame([
    (1, "B", "X1"), (None, None, None), (None, "B", "X1"), (None, "C", None)],
    ("ID", "TYPE", "CODE")
)

df.na.drop(how="all").show()
+----+----+----+
|  ID|TYPE|CODE|
+----+----+----+  
|   1|   B|  X1|
|null|   B|  X1|
|null|   C|null|
+----+----+----+

可以使用thresholdNOT NULL 值的数量)实现替代公式:

df.na.drop(thresh=1).show()
+----+----+----+
|  ID|TYPE|CODE|
+----+----+----+
|   1|   B|  X1|
|null|   B|  X1|
|null|   C|null|
+----+----+----+

【讨论】:

【参考方案2】:

一种选择是使用functools.reduce 来构造条件:

from functools import reduce
df.filter(~reduce(lambda x, y: x & y, [df[c].isNull() for c in df.columns])).show()
+----+----+----+
|  ID|TYPE|CODE|
+----+----+----+
|   1|   B|  X1|
|null|   B|  X1|
+----+----+----+

reduce 产生如下查询:

~reduce(lambda x, y: x & y, [df[c].isNull() for c in df.columns])
# Column<b'(NOT (((ID IS NULL) AND (TYPE IS NULL)) AND (CODE IS NULL)))'>

【讨论】:

【参考方案3】:

你可以试试这个。

df=df.dropna(how='all')

【讨论】:

以上是关于Pyspark数据框如何删除所有列中的空行?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 pyspark 数据框列中的列表中删除特定字符串

PySpark 2.2 爆炸删除空行(如何实现explode_outer)? [复制]

pySpark:如何在数据框中的 arrayType 列中获取 structType 中的所有元素名称?

Pyspark 删除数据框列中的多个字符

如果 spark 数据框的特定列中的所有条目都为空,则删除

如何将 pyspark 数据框列中的值与 pyspark 中的另一个数据框进行比较