【问题标题】:Scala: Having a filter, selecting the values from another columnScala:有一个过滤器,从另一列中选择值
【发布时间】:2021-07-06 18:15:26
【问题描述】:

首先,我在 IntelliJ 上使用 Scala。有这个:

type     |  age
electric |  30
diesel   |  24
gasoline |  28
diesel   |  31

我想定义一个函数来获取“age”列的平均值,不包括“electric”类型。我不知道如何过滤一列,然后在维护过滤器的另一列中操作。现在,我做了这个:

  def nonelectric (c: Seq[Df]): Double = {
    val cars = c.map(k => k.type)
    val nonelectriccars = cars.filterNot(cars=> cars == "electric")
    var a:Double = 0.0
    for (i <- nonelectriccars){
      a += i
    }
    a/nonelectriccars.size.toDouble
  }

但是,当然,我无法从“字符串”类型中得到平均值。如何修复我的代码?

【问题讨论】:

  • 不要在filterNot() 之前删除age 信息(就像在第一个.map() 中所做的那样)。过滤car =&gt; car.type == "electric"。这样nonelectriccars 仍然有你在for循环中需要的信息(无论你是map(car =&gt; car.age) 还是a += i.age)。
  • 谢谢,我如何选择.map() 中的两列?
  • 假设您有超过 2 列,您根本不需要删除任何其他列(至少在您的问题中不是)。不过,如果您只想保留几列,.map(car =&gt; (car.type, car.age)) 应该可以正常工作。

标签: scala


【解决方案1】:

假设Dfclass 字段carTypevalue 那么这是一个可能的解决方案:

def nonelectric(c: Seq[Df]): Double = {
  val nonelectriccars =
    c.collect { case df if df.carType != "electric" => df.value }

  if (nonelectriccars.isEmpty) {
    0.0
  } else {
    nonelectriccars.sum.toDouble / nonelectriccars.length
  }
}

collect 是一种有用的方法,它可以使用偏函数将filter 操作和map 操作结合起来。

如果 DF 实际上是一个数据框,那么这是一个 Spark 问题,我无能为力!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2016-01-10
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多