gpt4 book ai didi

python - 使用 PySpark 对数字列进行分箱

转载 作者:行者123 更新时间:2023-12-04 08:11:14 25 4
gpt4 key购买 nike

我有一个 PySpark DataFrame df,它有一个数字列(带有 NaN)

+-------+
|numbers|
+-------+
| 142.56|
| |
|2023.33|
| 477.76|
| 175.52|
|1737.45|
| 520.72|
| 641.2|
| 79.3|
| 138.43|
+-------+

我想创建一个新列来定义一些容器,例如0, (0, 500], (500, 1000], (1000, inf)

有没有办法使用类似 pandas.cut 的函数来完成此操作? ?目前我使用 PySpark 的方法是定义一个 udf 函数,但这种方法的缺点是乏味且非参数

from pyspark.sql import functions as F
from pyspark.sql.types import *

def func(numbers):
if numbers==0:
return '0'
elif numbers>0 and numbers<=500:
return '(0, 500]'
elif numbers>500 and numbers<=1000:
return '(500, 1000]'
elif numbers>500:
return '(500, inf)'
else return 'Other'

func_udf = F.udf(func, StringType())

df.withColumn('numbers_bin', func_udf(df['numbers']))

如果 df 是 Pandas DataFrame,我会使用这种方法:

df['numbers_bin'] = pd.cut(
df['numbers'],
np.concatenate((-np.inf, [0, 500, 1000], np.inf), axis=None))

哪个更简洁和模块化

最佳答案

您可以使用 Spark ML 中的 Bucketizer:

from pyspark.ml.feature import Bucketizer

df2 = Bucketizer(
splits=[-float('inf'), 0, 500, 1000, float('inf')],
inputCol='numbers',
outputCol='numbers_bin'
).transform(df)

df2.show()
+-------+-----------+
|numbers|numbers_bin|
+-------+-----------+
| 142.56| 1.0|
| null| null|
|2023.33| 3.0|
| 477.76| 1.0|
| 175.52| 1.0|
|1737.45| 3.0|
| 520.72| 2.0|
| 641.2| 2.0|
| 79.3| 1.0|
| 138.43| 1.0|
+-------+-----------+

如果您想改为显示间隔:

import pyspark.sql.functions as F

df2 = Bucketizer(
splits=[-float('inf'), 0, 500, 1000, float('inf')],
inputCol='numbers',
outputCol='numbers_bin'
).transform(df).withColumn(
'numbers_bin',
F.expr("""
format_string(
'%s, %s',
array(-float('inf'), 0, 500, 1000, float('inf'))[int(numbers_bin) - 1],
array(-float('inf'), 0, 500, 1000, float('inf'))[int(numbers_bin)])
""")
)

df2.show()
+-------+--------------+
|numbers| numbers_bin|
+-------+--------------+
| 142.56|-Infinity, 0.0|
| null| null, null|
|2023.33| 500.0, 1000.0|
| 477.76|-Infinity, 0.0|
| 175.52|-Infinity, 0.0|
|1737.45| 500.0, 1000.0|
| 520.72| 0.0, 500.0|
| 641.2| 0.0, 500.0|
| 79.3|-Infinity, 0.0|
| 138.43|-Infinity, 0.0|
+-------+--------------+

关于python - 使用 PySpark 对数字列进行分箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65950652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com