【问题标题】:Make Bins in pyspark with range of values and specific values在 pyspark 中制作具有值范围和特定值的 Bins
【发布时间】:2020-12-02 18:57:43
【问题描述】:

我想在 pyspark 数据框列上创建具有值范围和特定值的 bin

在这篇文章中How to bin in PySpark? 它解释了如何制作垃圾箱,但它仅适用于值范围,从 0 到 6,从 6 到 18 等等,我想只为特定的垃圾箱值,例如,我想要从 0 到 5、5 到 9、10、11 到 20、21 等的 bin

+-----------+
| 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') ]

【问题讨论】:

    标签: python apache-spark pyspark categories categorization


    【解决方案1】:

    您可以手动指定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|
    +---+----+
    

    【讨论】:

      猜你喜欢
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2020-03-14
      • 2014-06-09
      • 1970-01-01
      相关资源
      最近更新 更多