我是scala Saddle的新手,我在一个框架中有三列(客户姓名,年龄和状态)。我必须在列(年龄)中应用过滤器。如果任何超过18岁的客户年龄我需要设置状态是“符合条件”,否则我需要“不合格”。
代码:
f.col("age").filterAt(x => x > 18) //but how to update Status column
答案 0 :(得分:0)
框架是不可变的容器,因此最好使用完全初始化的值来构建框架,而不是从部分初始化的框架开始。
import org.saddle._
object Test {
def main(args: Array[String]): Unit = {
val names: Vec[Any] = Vec("andy", "bruce", "cheryl", "dino", "edgar", "frank", "gollum", "harvey")
val ages: Vec[Any] = Vec(4, 89, 7, 21, 14, 18, 23004, 65)
def status(age: Any): Any = if (age.asInstanceOf[Int] >= 18) "eligible" else "noteligible"
def mapper(indexAge: (Int, Any)): (Int, _) = indexAge match {
case (index, age) => (index, status(age))
}
val nameAge: Frame[Int, String, Any] = Frame("name" -> names, "age" -> ages)
val ageCol: Series[Int, Any] = nameAge.colAt(1)
val eligible: Series[Int, Any] = ageCol.map( mapper )
println("" + nameAge)
println("" + eligible)
val nameAgeStatus: Frame[Int, String, _] = nameAge.joinSPreserveColIx(eligible, how=index.LeftJoin, "status")
println("" + nameAgeStatus)
}
}
如果您确实需要从部分初始化的帧开始,您可以随时删除未初始化的列并使用正确计算的值将其添加回来。
虽然我更喜欢强类型数据列,但我认为Frame只包含一种类型的数据,而“Int”和“String”的通用类型是“Any”。这也会影响方法的类型签名,尽管您可能希望在没有类型信息的情况下内联它们。
我发现看scaladoc有很多帮助。
这是最终println调用的输出:
[8 x 3]
name age status
------ ----- -----------
0 -> andy 4 noteligible
1 -> bruce 89 eligible
2 -> cheryl 7 noteligible
3 -> dino 21 eligible
4 -> edgar 14 noteligible
5 -> frank 18 eligible
6 -> gollum 23004 eligible
7 -> harvey 65 eligible