假设一个给定的dataframe:
| 型号|颜色|
| - -----|- -----|
| 汽车|红色|
| 汽车|红色|
| 汽车|蓝色|
| 卡车|红色|
| 卡车|蓝色|
| 卡车|黄色|
| SUV|蓝色|
| SUV|蓝色|
| 汽车|蓝色|
| 汽车|黄色|
我想添加颜色列,以保持每个模型中每种颜色的计数,以给予以下 Dataframe :
| 型号|颜色|红色|蓝色|黄色|
| - -----|- -----|- -----|- -----|- -----|
| 汽车|红色|2| 2| 1|
| 汽车|红色|2| 2| 1|
| 汽车|蓝色|2| 2| 1|
| 卡车|红色|1| 1| 1|
| 卡车|蓝色|1| 1| 1|
| 卡车|黄色|1| 1| 1|
| SUV|蓝色|0| 2| 0|
| SUV|蓝色|0| 2| 0|
| 汽车|蓝色|2| 2| 1|
| 汽车|黄色|2| 2| 1|
这个数据集有数十亿条记录,所以我尽量远离UDF,如果可能的话,我更喜欢使用内置的方法。
我通常使用带有.size()和.collect_set()的窗口函数来计算这种类型的数据,但是基于不同的列类别添加多个不同的新df列会给我带来问题,因为我不确定是否需要通过添加额外的窗口分区或.where()或isin()方法来隔离单个类别。任何反馈或建议都很感激。谢谢你。
2条答案
按热度按时间1hdlvixo1#
让我们用
window
函数和内置的PySpark
DataFrame
函数来做这件事,window
在计算上可能非常昂贵,特别是对于大数据集,所以也许可以为你的方法寻找一种更好的方法。不要忘记将data
和df
替换为实际的data
和DataFrame
e0bqpujr2#
如果您不关心保留原始顺序,可以使用一行程序完成:
如果您关心顺序,它仍然可以作为一行程序完成: