我有以下格式的数据框
Col-1Col-2
a d1
a d2
x d3
a d4
f d5
a d6
a d7
我想通过查看col1中的连续重复项来合并col-2中的值。我们可以看到有两次出现连续重复的情况。它应该分别合并d1 + d2和d6 + d7。这些列的数据类型是字符串,d1 + d2表示将字符串d1与d2连接
最终输出应如下所示
Col-1Col-2
a d1+d2
x d3
a d4
f d5
a d6+d7
答案 0 :(得分:1)
您需要一个用于定义DataFrame顺序的列。如果尚不存在,则可以使用pyspark.sql.functions.monotonically_increasing_id
创建一个。
import pyspark.sql.functions as f
df = df.withColumn("id", f.monotonically_increasing_id())
接下来,您可以使用this post中描述的技术为每组连续重复项创建细分:
import sys
import pyspark.sql.Window
globalWindow = Window.orderBy("id")
upToThisRowWindow = globalWindow.rowsBetween(-sys.maxsize-1, 0)
df = df.withColumn(
"segment",
f.sum(
f.when(
f.lag("Col-2", 1).over(globalWindow) != f.col("Col-2"),
1
).otherwise(0)
).over(upToThisRowWindow)+1
)
现在,您可以按细分进行分组,并使用pyspark.sql.functions.collect_list
进行汇总,将值集合到列表中,并pyspark.sql.functions.concat()
连接字符串:
df = df.groupBy('segment').agg(f.concat(f.collect_list('Col-2'))).drop('segment')