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|
+----+----+----+
可以使用threshold
(NOT 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 2.2 爆炸删除空行(如何实现explode_outer)? [复制]