假设我有两个小组:“ 1”和“ 2”。
ls = [
['1', 2],
['2', 7],
['1', 3],
['2',-6],
['1', 3],
['1', 5],
['1', 4],
['2', 7]
]
df = spark.createDataFrame(pd.DataFrame(ls, columns=['col1', 'col2']))
df.show()
+----+-----+
|col1| col2|
+----+-----+
| 1| 2|
| 2| 7|
| 1| 3|
| 2| -6|
| 1| 3|
| 1| 5|
| 1| 4|
| 2| 7|
+----+-----+
我已经使用以下方法为每个组计算了QuantileDiscretizer():
discretizer = QuantileDiscretizer(numBuckets=3, inputCol="col2", outputCol="result")
bucketizer_1 = discretizer.fit(df.filter(col('col1')=='1'))
bucketizer_2 = discretizer.fit(df.filter(col('col1')=='2'))
这些存储桶存储在列表中,因此我可以使用索引(存储桶[0],存储桶[1])来调用它们
现在,我正在尝试使用存储桶将col2中的数据转换为分位数。换句话说,如果col1 =='1',则bucketizers [0] .transform(data)->将结果存储在数据帧的新列中。组'2'的处理相同,但具有存储桶程序[1]。
(让我们忽略为什么我不适合一次转换数据的原因)
由于transform()使用列作为输入,因此我正在努力编写代码以获得所需的内容。
有人可以帮忙吗?
答案 0 :(得分:0)
我能想到的一种解决方案是使用union:
bucketizers[0].transform(df.filter((F.col('col1')=='1'))).union(bucketizers[1].transform(df.filter(F.col('col1')=='2'))).show()