Pyspark:基于列和秩的求和删除/筛选行

Pyspark:基于列和秩的求和删除/筛选行,pyspark,apache-spark-sql,pyspark-dataframes,Pyspark,Apache Spark Sql,Pyspark Dataframes,我有这样一个数据帧: df = pd.DataFrame({"Date": ["2020-05-10", "2020-05-10", "2020-05-10", "2020-05-11", "2020-05-11", "2020-05-11", "2020-05-11", "2020-05-11", "2020-05-11"], "Slot_Length": [30, 30, 30, 30, 30, 30, 30, 30, 30],

我有这样一个数据帧:

df = pd.DataFrame({"Date": ["2020-05-10", "2020-05-10", "2020-05-10", "2020-05-11", "2020-05-11", "2020-05-11", "2020-05-11", "2020-05-11", "2020-05-11"],
                   "Slot_Length": [30, 30, 30, 30, 30, 30, 30, 30, 30],
                   "Total_Space": [60, 60, 60, 120, 120, 120, 120, 120, 120],
                   "Amount_Over": [-30, -30, -30, -60, -60, -60, -60, -60, -60],
                   "Rank": [1, 1, 2, 1, 1, 1, 1, 2, 2]})

df = spark.createDataFrame(df)

+----------+-----------+-----------+-----------+----+
|      Date|Slot_Length|Total_Space|Amount_Over|Rank|
+----------+-----------+-----------+-----------+----+
|2020-05-10|         30|         60|        -30|   1|
|2020-05-10|         30|         60|        -30|   1|
|2020-05-10|         30|         60|        -30|   2|
|2020-05-11|         30|        120|        -60|   1|
|2020-05-11|         30|        120|        -60|   1|
|2020-05-11|         30|        120|        -60|   1|
|2020-05-11|         30|        120|        -60|   1|
|2020-05-11|         30|        120|        -60|   2|
|2020-05-11|         30|        120|        -60|   2|
+----------+-----------+-----------+-----------+----+
对于每个
日期
我都有一个可以填充的
总空间
。所以对于
2020-05-10
,我有60秒,对于
2020-05-11
我有120秒

每个
日期
也已经分配了具有特定
插槽长度的插槽

对于每个
日期
,我已经计算了
日期
金额_over
列中的空间量,并根据此处未显示的优先级列对其进行了适当排序

我想做的是删除
日期
排名最低的行
,直到
插槽长度
加起来成为
日期的
总空间

+----------+-----------+-----------+-----------+----+
|      Date|Slot_Length|Total_Space|Amount_Over|Rank|
+----------+-----------+-----------+-----------+----+
|2020-05-10|         30|         60|        -30|   1|
|2020-05-10|         30|         60|        -30|   1|
|2020-05-11|         30|        120|        -60|   1|
|2020-05-11|         30|        120|        -60|   1|
|2020-05-11|         30|        120|        -60|   1|
|2020-05-11|         30|        120|        -60|   1|
+----------+-----------+-----------+-----------+----+
在本例中,很容易将所有
Rank
的值都降低为2,但也会有一些列之间存在平局的示例,因此首先取最高的列,如果存在平局,则随机取一个

最好的方法是什么?我已经了解到,它需要一个窗口函数来正确计算
插槽长度
总空间
,以及
金额

df = pd.DataFrame({"Date": ["2020-05-10", "2020-05-10", "2020-05-10", "2020-05-11", "2020-05-11", "2020-05-11",
                            "2020-05-11", "2020-05-11", "2020-05-11"],
                   "Slot_Length": [30, 30, 30, 30, 30, 30, 30, 30, 30],
                   "Total_Space": [60, 60, 60, 120, 120, 120, 120, 120, 120],
                   "Amount_Over": [-30, -30, -30, -60, -60, -60, -60, -60, -60],
                   "Rank": [1, 1, 2, 1, 1, 1, 1, 2, 2]})

df = spark.createDataFrame(df)
w = Window.partitionBy("Date").orderBy("Rank").rowsBetween(Window.unboundedPreceding, Window.currentRow)
df.withColumn(
    "Cumulative_Sum", F.sum("Slot_Length").over(w)
).filter(
    F.col("Cumulative_Sum") <= F.col("Total_Space")
).orderBy("Date","Rank","Cumulative_Sum").show()
+----------+-----------+-----------+-----------+----+--------------+
|      Date|Slot_Length|Total_Space|Amount_Over|Rank|Cumulative_Sum|
+----------+-----------+-----------+-----------+----+--------------+
|2020-05-10|         30|         60|        -30|   1|            30|
|2020-05-10|         30|         60|        -30|   1|            60|
|2020-05-11|         30|        120|        -60|   1|            30|
|2020-05-11|         30|        120|        -60|   1|            60|
|2020-05-11|         30|        120|        -60|   1|            90|
|2020-05-11|         30|        120|        -60|   1|           120|
+----------+-----------+-----------+-----------+----+--------------+