是否存在針對以下問題的優雅功能?
我的任務是創建一個函式來確定天數的差異并對值進行排名。最接近的正數將排名為 0 并成為“起點”。從起點開始,根據排名值是負數還是非負數,該函式將分別為正數或負數的值分配排名。
| 日期差異() | 秩 |
|---|---|
| -50 | -3 |
| -32 | -2 |
| -1 | -1 |
| 5 | 0 |
| 14 | 1 |
| 32 | 2 |
| 128 | 3 |
| 254 | 4 |
到目前為止,我的解決方案是將負數和正數分開,并使用 window.partitionBy() 函式來分配相關等級。它會起作用,但我對更優雅的解決方案感到好奇。:)
uj5u.com熱心網友回復:
您可以使用Window生成序列號以用作等級:
from pyspark.sql.functions import col, row_number
from pyspark.sql.window import Window
df = spark.createDataFrame([(10,),(-10,),(5,),(-5,),(15,),(-15,)], ["dated_diff"])
window = Window.orderBy(df["dated_diff"])
df = df.select("dated_diff", row_number().over(window).alias("row_number"))
df.show()
---------- ----------
|dated_diff|row_number|
---------- ----------
| -15| 1|
| -10| 2|
| -5| 3|
| 5| 4|
| 10| 5|
| 15| 6|
---------- ----------
然后找到第一個正數的秩:
first_positive_rank = df.filter("dated_diff>=0").first()["row_number"]
print(first_positive_rank)
>> 4
OR
first_positive_rank = df.filter("dated_diff<0").count() 1
print(first_positive_rank)
>> 4
最后從所有排名中減去該排名:
df = df.withColumn("row_number", col("row_number") - first_positive_rank)
df.show()
---------- ----------
|dated_diff|row_number|
---------- ----------
| -15| -3|
| -10| -2|
| -5| -1|
| 5| 0|
| 10| 1|
| 15| 2|
---------- ----------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/507889.html
