我有一个PySpark Dataframe :
| 用户标识|库|作用|
| - -|- -|- -|
| 一百二十三|小行星2345| 2个|
| 一百二十三|小行星2345|第0页|
| 一百二十三|小行星5422|第0页|
| 一百二十三|小行星762|第0页|
| 二百三十一|小行星4322| 2个|
| 二百三十一|小行星4322|第0页|
| 二百三十一|小行星8342|第0页|
| 二百三十一|小行星5342|第0页|
输出应如下所示:
| 用户标识|sku_pos| sku_neg|
| - -|- -|- -|
| 一百二十三|小行星2345|小行星5422|
| 一百二十三|小行星2345|小行星762|
| 二百三十一|小行星4322|小行星8342|
| 二百三十一|小行星4322|小行星5342|
对于每个不同的“userid”,“action”不大于0的“sku”将进入“sku_neg”列,而“action”大于0的“sku”将进入“sku_pos”列。
3条答案
按热度按时间bnlyeluc1#
需要几个聚合:
最后,展开列表。
输入:
脚本:
monwx1rj2#
通过过滤pos/neg记录并按“userid”分组来创建正 Dataframe 和负 Dataframe :
连接正负 Dataframe 并分解正/负记录:
使用的数据集:
oo7oh9g93#
另一个解决方案看起来很好,但为了以防万一,另一个方法不需要连接。注意,我假设每个
userid
只有一个sku_pos
。如果不是这样,这个方法就不起作用。基本上,首先使用
groupBy
分别收集正的和负的sku
,然后使用f.col("skus").getItem(0)
只选择一个sku_pos
,使用另一个groupBy
使每个userid
有一行,最后分解sku_neg
数组。