火花数据集过滤器列,条件如pandas

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了火花数据集过滤器列,条件如pandas相关的知识,希望对你有一定的参考价值。

我是Spark / Scala的新手。我不知道如何使用spark数据集来过滤像pandas.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的列表,如果字段的值为null,则列名称与0关联,否则为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)

编辑其他方法:为避免展平数据,可以使用聚合函数

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 : _*)
另一答案

您可以迭代数据帧的列,并删除具有多个空值的列。

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)
   }
}

以上是关于火花数据集过滤器列,条件如pandas的主要内容,如果未能解决你的问题,请参考以下文章

Pandas常见的数据过滤方法通过列条件筛选行数据

Pandas:过滤具有多个字符串条件的行[重复]

制作数据集数据过滤和数据缺失策略-pandas-sklearn

使用列值筛选行作为另一个数据集的条件

加入复杂条件的火花数据集

多条件过滤器 python pandas