如果列最大值小于定义的阈值,则从数据帧中删除所有行(对于给定的列值)



如果问题标题有点令人困惑,请道歉。我是pyspark的新手,正在处理以下问题:

假设我有一个数据框架,其中日期、产品和总订单为三列,并且我有这个数据框架,为期3天。所以类似的东西

date           product      orders
2022-01-01      whisky        11
2022-01-01      rum           100
2022-01-01      bourbon       5
2022-01-02      whisky        20
2022-01-02      rum           150
2022-01-02      bourbon       7 
2022-01-03      whisky        30
2022-01-03      rum           7
2022-01-03      bourbon       3

我想过滤掉最大订单数小于10的任何产品。因此,在上面的数据帧的情况下,包含波旁威士忌作为产品的所有行都将被过滤掉,作为max(波旁威士忌的订单(<10.

输出:

date       product      orders
2022-01-01      whisky        11
2022-01-01      rum           100
2022-01-02      whisky        20
2022-01-02      rum           150
2022-01-03      whisky        30
2022-01-03      rum           7

最好的方法是什么?我一直在pyspark中查找int Window函数,但一直没能找到正确的方法。

我创建了一个类似的windowspec

windowSpec = Window.partitionBy(groupedDf['product']).orderBy(groupedDf['orders'].desc())

但是在过滤掉数据帧行方面存在问题。

您可以首先为每个product找到max orders,然后根据该值进行筛选。

df = df.selectExpr('*', 'max(orders) over (partition by product) as max_orders') 
.filter('max_orders >= 10').drop('max_orders')
df.show(truncate=False)

这只是窗口函数的情况。

from pyspark.sql.window import Window
import pyspark.sql.functions as F
window = Window.partitionBy("product").orderBy(F.col("orders").desc())
df.withColumn("rn", F.row_number().over(window)).filter("rn < 10")

最新更新