首页 > 解决方案 > python pandas在scala中切割

问题描述

怎么能pd.cut(给定一些拆分的数组桶), https://pandas.pydata.org/pandas-docs/stable/generated/pandas.cut.html

>>> pd.cut(np.array([1, 7, 5, 4, 6, 3]), 3)
... 
[(0.994, 3.0], (5.0, 7.0], (3.0, 5.0], (3.0, 5.0], (5.0, 7.0], ...
Categories (3, interval[float64]): [(0.994, 3.0] < (3.0, 5.0] ...

即一个Array的分离

Seq(1, 7, 5, 4, 6, 3)

放入箱中,给定拆分列表

Seq(3,5)

在scala中完成?

编辑

也许对熊猫文档的引用具有误导性/不够清楚。我想将指定的数组(假设整数)分成组(桶):

[b_1, b_2, ...b_n[

即在这种情况下,具有 2 个分桶条件的接收n+1组类似于:

Seq(("[0-3]", Seq(1,3)),("4-5", Seq(4,5)), ("is 6-[", Seq(7))

即将连续的数字范围分配给离散的组。

标签: pythonscalapandas

解决方案


你的问题有点含糊。Pandascut有八个参数,其中大部分是可选的,具有默认含义或值,其中一些可以接受不同的数据类型(例如bins可以是IntSeq[Int])。我假设您不是在寻找模仿所有各种行为的东西。这可能比大多数 SO 居民愿意贡献的代码更多。

我认为,这是一个简单的小东西,可以理解您在问题的编辑部分中描述的内容。

def pdCut(x :Seq[Int], bins :Seq[Int]) :Seq[(String,Seq[Int])] = {
  val bs = bins.sorted.foldRight(Seq(("@",Seq(Int.MaxValue)))){case (b,v) =>
    val (str,sq) = v.head
    (s"$b", Seq(b)) +: (s"$b-$str", b +: sq) +: v.tail
  }
  val (str,sq) = bs.head
  val xs = (s"@-$str", Int.MinValue +: sq) +: bs.tail
  x.map(n => xs.find(_._2(1) >= n).get)
}

如果负数不是问题,您可以替换Int.MinValue为。0

用法:

pdCut(Seq(3,6,4,1,9,5), Seq(3,5))
//res0: Seq[(String, Seq[Int])] = Seq((@-3,Seq(-2147483648, 3)), (5-@,Seq(5, 2147483647)), (3-5,Seq(3, 5)), (@-3,Seq(-2147483648, 3)), (5-@,Seq(5, 2147483647)), (3-5,Seq(3, 5)))

推荐阅读