Pyspark:在groupBy中逐行显示

时间:2018-11-05 15:54:33

标签: group-by pyspark apache-spark-sql row aggregate

我有一个pyspark数据框,我想在组内将另一行分开。在组内将有两行:一行的计数值为removal == 1,另一行的计数值为removal == 0

我如何将一个计数除以另一个以在新列中获得每个组的比率? groupBylimittest_id

columns = ['removal', 'limit', 'test_id', 'count']
vals = [
    (1, 'UL', 'AB', 141),
    (0, 'UL', 'AB', 140),
    (1, 'LL', 'AB', 21),
    (0, 'LL', 'AB',12),
    (0, 'UL', 'EF', 200),
    (1, 'UL', 'EF',12)

]

我想要什么:(或布局类似)

columns = ['limit', 'test_id', 'ratio', count_1, count_0]
vals = [
    ('UL', 'AB', 1.007, 141, 140)
    ('LL', 'AB', 1.75, 21, 12),
    ('UL', 'EF', 0.06, 12, 200)
]

我知道通过拆分然后再次合并数据的方法,但我希望有一个更好的agg函数。

1 个答案:

答案 0 :(得分:2)

由于每个where的值只有一行,因此直接的方法是使用join来过滤每个不同的值和from pyspark.sql.functions import col df.where("removal = 1").alias("a")\ .join(df.where("removal = 0").alias("b"), on=["limit", "test_id"])\ .select( "limit", "test_id", (col("a.count") / col("b.count")).alias("ratio"), col("a.count").alias("count_1"), col("b.count").alias("count_0") ).show() #+-----+-------+------------------+-------+-------+ #|limit|test_id| ratio|count_1|count_0| #+-----+-------+------------------+-------+-------+ #| UL| AB|1.0071428571428571| 141| 140| #| LL| AB| 1.75| 21| 12| #| UL| EF| 0.06| 12| 200| #+-----+-------+------------------+-------+-------+

{{1}}