我有一个数据框架,如下所示。我必须将其索赔_typ作为'pd'的行排名,并与当前行的等级有所不同,并将其添加为新列。
源数据框:
Id svc_dt clm_typ rank
48115882 20180209 RV 1
48115882 20180209 RJ 2
48115882 20180216 RJ 3
48115882 20180302 RJ 4
48115882 20180402 PD 5
48115882 20180502 RJ 6
预期的结果框架:
Id svc_dt clm_typ rank diff_PD_Rank
48115882 20180209 RV 1 4 (Current rank - rank of column with 'PD')
48115882 20180209 RJ 2 3
48115882 20180216 RJ 3 2
48115882 20180302 RJ 4 1
48115882 20180402 PD 5 null
48115882 20180502 RJ 6 null
pyspark解决方案。
假设每个ID每个clm_type'pd'有一行,则可以使用max(when...))
使用条件聚合来获得必要的区别。
# necessary imports
w1 = Window.partitionBy(df.id).orderBy(df.svc_dt)
df = df.withColumn('rnum',row_number().over(w1))
w2 = Window.partitionBy(df.id)
res = df.withColumn('diff_pd_rank',max(when(df.clm_typ == 'PD',df.rnum)).over(w2) - rnum)
res.show()