火花数据集滤波器列,带有熊猫等条件



我是Spark/Scala的新手。我不知道如何使用Spark数据集过滤Pandas.loc.loc。

熊猫代码:

data_fact = pd.read_excel(path, sheetname=sheetname_factor)
//drop some columns which have too many null value
data_fact_v1=data_fact.loc[:,((data_fact>0).sum()>len(data_fact) *0.7)]

您的帮助非常感谢!

我将使用RDD为此,因为API更灵活。在以下代码中,我将每一行映射到tuple2的列表,并将列名与0关联的列映射到字段的值为null,否则为1。然后,我用reduceByKey弄平了所有内容,并计算每列的非零值的数量。我终于丢弃了与原始数据框架中不符合您要求的列。

var data = ...
val cols = data.columns
val total = data.count
val nullMap = data.rdd
    .flatMap{row => cols.filter(col => row.getAs(col) == null).map(col => (col, 1) ) }
    .reduceByKey(_+_)
    .collectAsMap
for(col <- cols) 
    if(nullMap.getOrElse(col, 0).toDouble / total < 0.7)
        data = data.drop(col)

edit 其他方法:避免数据平坦,您可以使用汇总函数

def combine(map1 : Map[String, Int], map2 : Map[String, Int]) = 
    map1.keySet
        .union(map2.keySet)
        .map(k => (k, map1.getOrElse(k, 0)+map2.getOrElse(k, 0)))
        .toMap
val nullMap = data.rdd.aggregate(Map[String, Int]())(
     (map, row)=> combine(map, cols.filter(col => row.getAs(col) == null).map(col => (col, 1)).toMap),
     combine)

,然后是相同的

for(col <- cols) 
    if(nullMap.getOrElse(col, 0).toDouble / total >= 0.3)
        data = data.drop(col)

val valid_columns = cols
    .filter(col => nullMap.getOrElse(col, 0).toDouble / total >= 0.3)
data = data.drop(valid_columns : _*)

您可以在数据框的列上迭代并删除其中一个null值。

val cols = data.columns
val limit = data.count * 0.7
for(mycol <- cols){
   if (data.filter(col(mycol).isNotNull).count < limit){
       data = data.drop(mycol)
   }
}

最新更新