在pyspark中生成包含值范围和特定值的容器

bogh5gae  于 2021-05-16  发布在  Spark
关注(0)|答案(1)|浏览(462)

我想在pysparkDataframe列上创建一个包含值范围和特定值的bin
在这篇文章中,如何在pyspark中使用bin?它解释了如何制作箱子,但它只适用于值的范围,从0到6,从6到18,等等,我只想有一个箱子用于特定的值,例如,我想要从0到5,5到9,10,11到20,21和更多的箱子

+-----------+
| Age | Bin |
+-----------+
|  4  |  1  |
| 10  |  3  |
|  6  |  2  |
| 40  |  5  |
|  2  |  1  |
|  8  |  2  |
+-----------+

我试过了

splits = [ 0, 5, 9, 10, 10, 11, float('Inf') ]

但它给出了一个错误
我用了一个公差,使垃圾箱只有10个,但我想知道是否有更好的办法

tol= 1.0e-10
splits = [ 0, 5, 9, 10, 10+tol, 11, float('Inf') ]
zlwx9yxi

zlwx9yxi1#

您可以手动指定 CASE WHEN 装箱栏:

from functools import reduce

splits = [ 0, 5, 9, 10, 11 ]
splits = list(enumerate(splits))

# >>> splits

# [(0, 0), (1, 5), (2, 9), (3, 10), (4, 11)]

bins = reduce(lambda c, i: c.when(F.col('Age') <= i[1], i[0]), splits, F.when(F.col('Age') < splits[0][0], None)).otherwise(splits[-1][0] + 1).alias('bins')

# >>> bins

# Column<b'CASE WHEN (Age < 0) THEN NULL WHEN (Age <= 0) THEN 0 WHEN (Age <= 5) THEN 1 WHEN (Age <= 9) THEN 2 WHEN (Age <= 10) THEN 3 WHEN (Age <= 11) THEN 4 ELSE 5 END AS `bins`'>

df = df.select('age', bins)

df.show()
+---+----+
|age|bins|
+---+----+
|  4|   1|
| 10|   3|
|  6|   2|
| 40|   5|
|  2|   1|
|  8|   2|
+---+----+

相关问题