當當前行等于 1 時,我想洗掉當前行 x 個月內的所有行(基于日期之前和之后)。
例如,給定這個 PySpark df:
ID | 日期 | 目標 |
---|---|---|
一種 | “2020-01-01” | 0 |
一種 | “2020-02-01” | 0 |
一種 | “2020-03-01” | 0 |
一種 | “2020-04-01” | 1 |
一種 | “2020-05-01” | 0 |
一種 | “2020-06-01” | 0 |
一種 | “2020-07-01” | 0 |
一種 | “2020-08-01” | 0 |
一種 | “2020-09-01” | 0 |
一種 | “2020-10-01” | 1 |
一種 | “2020-11-01” | 0 |
b | “2020-01-01” | 0 |
b | “2020-02-01” | 0 |
b | “2020-03-01” | 0 |
b | “2020-05-01” | 1 |
(注意,id b 的四月不退出)
如果使用 x 值為 2,則生成的 df 將是:
ID | 日期 | 目標 |
---|---|---|
一種 | “2020-01-01” | 0 |
一種 | “2020-04-01” | 1 |
一種 | “2020-07-01” | 0 |
一種 | “2020-10-01” | 1 |
b | “2020-01-01” | 0 |
b | “2020-02-01” | 0 |
b | “2020-05-01” | 1 |
我可以使用下面的代碼在感興趣的行之前和之后洗掉第 x 行,但我想根據日期洗掉當前行和 x 之間的所有行。
window = 2
windowSpec = Window.partitionBy("id").orderBy(['id','date'])
df= df.withColumn("lagvalue", lag('target', window).over(windowSpec))
df= df.withColumn("leadvalue", lead('target', window).over(windowSpec))
df= df.where(col("lagvalue") == 0 & col("leadvalue") == 0)
uj5u.com熱心網友回復:
在您的情況下,rangeBetween
可能非常有用。它關注值,只取范圍內的值。例如rangeBetween(-2, 2)
,將所有值從下面的 2 到上面的 2。由于rangeBetween
不適用于日期(或字串),我使用months_between
.
from pyspark.sql import functions as F, Window
df = spark.createDataFrame(
[('a', '2020-01-01', 0),
('a', '2020-02-01', 0),
('a', '2020-03-01', 0),
('a', '2020-04-01', 1),
('a', '2020-05-01', 0),
('a', '2020-06-01', 0),
('a', '2020-07-01', 0),
('a', '2020-08-01', 0),
('a', '2020-09-01', 0),
('a', '2020-10-01', 1),
('a', '2020-11-01', 0),
('b', '2020-01-01', 0),
('b', '2020-02-01', 0),
('b', '2020-03-01', 0),
('b', '2020-05-01', 1)],
['id', 'date', 'target']
)
window = 2
windowSpec = Window.partitionBy('id').orderBy(F.months_between('date', F.lit('1970-01-01'))).rangeBetween(-window, window)
df = df.withColumn('to_remove', F.sum('target').over(windowSpec) - F.col('target'))
df = df.where(F.col('to_remove') == 0).drop('to_remove')
df.show()
# --- ---------- ------
# | id| date|target|
# --- ---------- ------
# | a|2020-01-01| 0|
# | a|2020-04-01| 1|
# | a|2020-07-01| 0|
# | a|2020-10-01| 1|
# | b|2020-01-01| 0|
# | b|2020-02-01| 0|
# | b|2020-05-01| 1|
# --- ---------- ------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/470798.html