我有一个PySpark数据框df
,其中有一个数值列(带有NaNs)
+-------+
|numbers|
+-------+
| 142.56|
| |
|2023.33|
| 477.76|
| 175.52|
|1737.45|
| 520.72|
| 641.2|
| 79.3|
| 138.43|
+-------+
我想创建一个新列来定义一些bin,例如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))
更干净更模块化
2条答案
按热度按时间dauxcl2d1#
您可以使用Spark ML的
Bucketizer
:如果要改为显示间隔:
6yt4nkrj2#
更进一步
现在,让我们添加每行的间隔
我使用广播来确保将列表发送到群集中的所有节点
最后,我们可以计算每个区间