删除具有空阈值编号的列

时间:2019-05-14 10:19:18

标签: python pandas pyspark

拥有一个数据集,并希望使用pyspark进行一些清理。删除所有空值大于75%的列。使用python:

df = df.dropna(axis='columns', thresh = int(0.75 * len(df)))

我如何使用pyspark实现这一目标

1 个答案:

答案 0 :(得分:0)

让我们创建一个虚构的DataFrame。目的是只有一个带有列B,C & D的DataFrame。

from pyspark.sql.functions import count, when
valuesCol = [(None,21,12,None,1),(8,None,3,1,None),(None,40,None,10,None),(None,2,None,6,None),(None,8,0,2,None)]
df = sqlContext.createDataFrame(valuesCol,['A','B','C','D','E'])
df.show()
+----+----+----+----+----+ 
|   A|   B|   C|   D|   E| 
+----+----+----+----+----+ 
|null|  21|  12|null|   1| 
|   8|null|   3|   1|null| 
|null|  40|null|  10|null| 
|null|   2|null|   6|null| 
|null|   8|   0|   2|null| 
+----+----+----+----+----+

现在,让我们聚合DataFrame并collect()Collectaction,它在驱动程序中将DataFrame的所有元素作为数组返回。

aggregated_row = df.select([(count(when(col(c).isNull(), c))/df.count()).alias(c) for c in df.columns]).collect()
aggregated_row
    [Row(A=0.8, B=0.2, C=0.4, D=0.2, E=0.8)]

Row()对象转换为list的{​​{1}}-

dictionary

最后,使用aggregated_dict_list = [row.asDict() for row in aggregated_row] aggregated_dict = aggregated_dict_list[0] {'D': 0.2, 'A': 0.8, 'C': 0.4, 'E': 0.8, 'B': 0.2} 查找那些dictionary comprehensions值大于总数的75%的列,然后删除这些列-

Null