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

rn0zuynd  于 2022-11-21  发布在  Spark
关注(0)|答案(3)|浏览(125)

如果问题标题有点混乱,我很抱歉。我是新来的pyspark,正在处理以下问题:
假设我有一个包含日期、产品和total_orders三列的 Dataframe ,并且我有一个为期3天的 Dataframe 。

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的任何产品。因此,在上面的 Dataframe 中,所有包含波旁威士忌作为产品的行都将被过滤掉,因为max(orders of bourbon)〈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

什么是最好的方法去做它?我一直在寻找int窗口函数在pyspark,但一直未能得到它的权利。
我已经创建了一个类似于下面的窗口规范。

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

但在过滤 Dataframe 行时遇到问题。

3hvapo4f

3hvapo4f1#

您可以先找出每个productmax orders,然后根据该值进行筛选。

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

vlurs2pr2#

这只是窗口函数的情况。

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")
q3qa4bjr

q3qa4bjr3#

PySpark DataFrame提供了一个方法toPandas()将其转换为PythonPandas.DataFrame,然后,首先将其转换为...

df = pyspark_df.toPandas()

您可以使用loc来使用简单的pandas条件索引:

df = df.loc[df["orders"] > 10]

相关问题