【问题标题】:Pyspark: devide one row by another in groupByPyspark:在 groupBy 中逐行划分
【发布时间】:2018-11-05 15:54:32
【问题描述】:

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

如何将一个计数除以另一个计数以获得新列中每个组的比率? groupBy 位于 limittest_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 函数。

【问题讨论】:

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


    【解决方案1】:

    由于removal 的每个值只有一行,直接的方法是使用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|
    #+-----+-------+------------------+-------+-------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      相关资源
      最近更新 更多