pyspark - 如何在pyspark中从与上一年相同的列中减去行值?
问题描述
我有这样的输入数据,以年份名称作为列,我想从今年减去过去一年的评级,并用一个新列作为评级差异。
year,movie_name,language,rating
2019,akash,english,10
2019,antony,kannada,9
2020,akash,english,10
2020,antony,kannada,8
我的结果数据框:我想要的
year,movie_name,language,rating,rating_diff
2019,akash,english,10,-
2019,antony,kannada,9,-
2020,akash,english,10,0
2020,antony,kannada,8,-1
任何帮助将不胜感激,谢谢。
解决方案
由于您要比较去年,因此year
应该按列排序。但也想保留movie_name
and language
,它们应该是按列分区。
将行上的评级与最近一年进行比较,该lag
功能在date
升序时使用。
import pyspark.sql.functions as f
from pyspark.sql import Window
w = Window.partitionBy('movie_name', 'language').orderBy('year')
df.withColumn('lead', f.lag('rating', 1).over(w)) \
.withColumn('rating_diff', f.when(f.col('lead').isNotNull(), f.col('rating') - f.col('lead')).otherwise(f.lit(None))) \
.show(10, False)
+----+----------+--------+------+----+-----------+
|year|movie_name|language|rating|lead|rating_diff|
+----+----------+--------+------+----+-----------+
|2019|antony |kannada |9 |null|null |
|2020|antony |kannada |8 |9 |-1 |
|2019|akash |english |10 |null|null |
|2020|akash |english |10 |10 |0 |
+----+----------+--------+------+----+-----------+
推荐阅读
- android - 有没有更好的方法将私有 MutableLiveData 公开为 ViewModel 的 LiveData。[安卓、科特林]
- firebase - 使用 Jest、Firebase 和 React-Native 运行测试
- c++ - 从数组中查找字符串
- axios - 使用 Apollo 运行时以 null 形式出现的查询。我不确定这是解析程序还是架构问题
- plot - 使用 scilab 绘制极坐标图时出错
- vue.js - Service Worker 中的 Vue PWA i18n
- python - 如何在pygame中使对象褪色
- c++ - 文件处理中的tellg() 和tellp() 函数显示出意外行为
- bash - Bash 将文件移动到目标文件夹
- algorithm - 如何从两个数组中选择元素以使总和最小?