如何识别项目在 Pyspark 中的首次出现
How to identify first appearance of items in Pyspark
我有下面提供的数据框。如果产品仅在 2021 年出现,我需要为第一次出现的产品创建一个标签为 'New'
的新列,否则为 'old'
。我正在使用 pyspark。
输入:
desc year
0 a 2019
1 a 2020
2 a 2020
3 b 2020
4 b 2019
5 b 2021
6 c 2021
7 a 2021
8 c 2021
9 e 2020
输出:
desc year Label
0 a 2019 old
1 a 2020 old
2 a 2020 old
3 b 2020 old
4 b 2019 old
5 b 2021 old
6 c 2021 New
7 a 2021 old
8 c 2021 New
9 e 2020 old
如果产品在 2021 年首次出现且没有历史记录,那么我们需要将产品标记为新产品。
数据:
df = spark.createDataFrame(
[
('a','2019')
,('a','2020')
,('a','2020')
,('b','2020')
,('b','2019')
,('b','2021')
,('c','2021')
,('a','2021')
,('c','2021')
,('e','2020')
], ['desc', 'year'])
您可以在按乘积 (desc
) 划分的 window 上计算 year
的最小值,然后检查结果是否等于 2021
。最后,要获得所需的标签而不是布尔值,您可以使用 when
函数。
from pyspark.sql.window import Window
import pyspark.sql.functions as f
win = Window.partitionBy('desc')
df.withColumn("New", f.min(f.col("year")).over(win) == "2021")\
.withColumn("New", f.when(f.col("New"), "New").otherwise("old"))\
.show()
+----+----+---+
|desc|year|New|
+----+----+---+
| a|2019|old|
| a|2020|old|
| a|2020|old|
| a|2021|old|
| b|2020|old|
| b|2019|old|
| b|2021|old|
| c|2021|New|
| c|2021|New|
| e|2020|old|
+----+----+---+
我想我回答了同样的问题,但找不到。无论如何,您可以使用 first
函数查找第一年,然后检查它是否是 2021
。
from pyspark.sql import functions as f
from pyspark.sql import Window
w = Window.partitionBy('desc')
df.withColumn('label', f.when(f.first('year').over(w) == f.lit('2021'), f.lit('new')).otherwise(f.lit('old'))) \
.show()
+----+----+-----+
|desc|year|label|
+----+----+-----+
| e|2020| old|
| c|2021| new|
| c|2021| new|
| b|2020| old|
| b|2019| old|
| b|2021| old|
| a|2019| old|
| a|2020| old|
| a|2020| old|
| a|2021| old|
+----+----+-----+
我有下面提供的数据框。如果产品仅在 2021 年出现,我需要为第一次出现的产品创建一个标签为 'New'
的新列,否则为 'old'
。我正在使用 pyspark。
输入:
desc year
0 a 2019
1 a 2020
2 a 2020
3 b 2020
4 b 2019
5 b 2021
6 c 2021
7 a 2021
8 c 2021
9 e 2020
输出:
desc year Label
0 a 2019 old
1 a 2020 old
2 a 2020 old
3 b 2020 old
4 b 2019 old
5 b 2021 old
6 c 2021 New
7 a 2021 old
8 c 2021 New
9 e 2020 old
如果产品在 2021 年首次出现且没有历史记录,那么我们需要将产品标记为新产品。
数据:
df = spark.createDataFrame(
[
('a','2019')
,('a','2020')
,('a','2020')
,('b','2020')
,('b','2019')
,('b','2021')
,('c','2021')
,('a','2021')
,('c','2021')
,('e','2020')
], ['desc', 'year'])
您可以在按乘积 (desc
) 划分的 window 上计算 year
的最小值,然后检查结果是否等于 2021
。最后,要获得所需的标签而不是布尔值,您可以使用 when
函数。
from pyspark.sql.window import Window
import pyspark.sql.functions as f
win = Window.partitionBy('desc')
df.withColumn("New", f.min(f.col("year")).over(win) == "2021")\
.withColumn("New", f.when(f.col("New"), "New").otherwise("old"))\
.show()
+----+----+---+
|desc|year|New|
+----+----+---+
| a|2019|old|
| a|2020|old|
| a|2020|old|
| a|2021|old|
| b|2020|old|
| b|2019|old|
| b|2021|old|
| c|2021|New|
| c|2021|New|
| e|2020|old|
+----+----+---+
我想我回答了同样的问题,但找不到。无论如何,您可以使用 first
函数查找第一年,然后检查它是否是 2021
。
from pyspark.sql import functions as f
from pyspark.sql import Window
w = Window.partitionBy('desc')
df.withColumn('label', f.when(f.first('year').over(w) == f.lit('2021'), f.lit('new')).otherwise(f.lit('old'))) \
.show()
+----+----+-----+
|desc|year|label|
+----+----+-----+
| e|2020| old|
| c|2021| new|
| c|2021| new|
| b|2020| old|
| b|2019| old|
| b|2021| old|
| a|2019| old|
| a|2020| old|
| a|2020| old|
| a|2021| old|
+----+----+-----+