我有下面提供的資料框。'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 年首次出現且沒有歷史記錄,那么我們需要將該產品標記為 New。
資料:
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'])
uj5u.com熱心網友回復:
您可以計算year按乘積 ( desc)劃分的視窗上的 min ,然后檢查結果是否等于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|
---- ---- ---
uj5u.com熱心網友回復:
我想我回答了同樣的問題,但找不到。無論如何,您可以使用該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|
---- ---- -----
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/370297.html
