Python 用PySpark组合数值列
我有一个PySpark数据帧Python 用PySpark组合数值列,python,pandas,apache-spark,pyspark,apache-spark-sql,Python,Pandas,Apache Spark,Pyspark,Apache Spark Sql,我有一个PySpark数据帧df,它有一个数字列(带NaN) 我想创建一个新列来定义一些容器,例如0,(0500),(5001000),(1000,inf) 有没有一种方法可以使用这样的函数来实现这一点? 目前,我使用PySpark实现这一点的方法是定义一个udf函数,如下所示,但这种方法的缺点是繁琐且非参数化 from pyspark.sql import functions as F from pyspark.sql.types import * def func(numbers):
df
,它有一个数字列(带NaN)
我想创建一个新列来定义一些容器,例如0,(0500),(5001000),(1000,inf)
有没有一种方法可以使用这样的函数来实现这一点?
目前,我使用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']))
您可以使用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|
+-------+--------------+
列的dType是什么?为什么第二行中有一个空条目?dType是浮点。我只考虑数字之间有空值的情况。谢谢。而不是索引?谢谢you@espogian我包括了一个可能的解决方案。有点难看,但希望能完成任务:)当然,这个很有用,谢谢
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|
+-------+--------------+