#python #apache-spark #pyspark #apache-spark-sql
#питон #apache-искра #пыспарк #apache-spark-sql
Вопрос:
У меня есть фрейм данных, приведенный ниже. Мне нужно создать новую колонку с меткой как 'New'
для первого появления продукта, если он появился только в 2021 году, и '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'])
Ответ №1:
Вы можете вычислить минимальное количество year
окон, разделенных по продукту ( desc
), а затем проверить, равен ли результат 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| ---- ---- ---
Ответ №2:
Я думаю, что мне ответили на тот же вопрос, но я не могу найти. В любом случае, вы можете использовать эту 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| ---- ---- -----