应用将列用作条件输入的函数

时间:2019-05-26 14:32:24

标签: python apache-spark pyspark

假设我有两个小组:“ 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()使用列作为输入,因此我正在努力编写代码以获得所需的内容。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

我能想到的一种解决方案是使用union

bucketizers[0].transform(df.filter((F.col('col1')=='1'))).union(bucketizers[1].transform(df.filter(F.col('col1')=='2'))).show()