我有一个带有多个数字列的pyspark DF,我希望每列根据每个变量计算该行的十分位数或其他分位数等级.
这对于pandas来说很简单,因为我们可以使用qcut函数为每个变量创建一个新列,为'q'分配值0到n-1,如pd.qcut(x,q = n).
怎么能在pyspark完成?我已经尝试了以下但很明显这些三分之一的断点并不是唯一的.我想得到分配1的下1/3,下一个1/3分配2和前1/3分配3.我希望能够改变这个并且可能使用1/10,1/32等
w = Window.partitionBy(data.var1).orderBy(data.var1)
d2=df.select(
"var1",
ntile(3).over(w).alias("ntile3")
)
agged=d2.groupby('ntile3').agg(F.min("var1").alias("min_var1"),F.max("var1").alias("max_var1"),F.count('*'))
agged.show()
+------+--------+--------+--------+
|ntile3|min_var1|max_var1|count(1)|
+------+--------+--------+--------+
| 1| 0.0| 210.0| 517037|
| 3| 0.0| 206.0| 516917|
| 2| 0.0| 210.0| 516962|
+------+--------+--------+--------+
Run Code Online (Sandbox Code Playgroud)
QuantileDiscretizer从'pyspark.ml.feature'可以使用.
values = [(0.1,), (0.4,), (1.2,), (1.5,)]
df = spark.createDataFrame(values, ["values"])
qds = QuantileDiscretizer(numBuckets=2,
... inputCol="values", outputCol="buckets", relativeError=0.01, handleInvalid="error")
bucketizer = qds.fit(df)
bucketizer.setHandleInvalid("skip").fit(df).transform(df).show()
+------+-------+
|values|buckets|
+------+-------+
| 0.1| 0.0|
| 0.4| 1.0|
| 1.2| 1.0|
| 1.5| 1.0|
+------+-------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2954 次 |
| 最近记录: |