如何根据匹配字段formId将dataframe的指定列聚合为数组
DataFrame分组聚合实现方案
以下分别提供Pandas和PySpark两种常用环境的实现代码:
Pandas 环境
核心逻辑是按Id、fomrid作为分组键,分别将values、occ字段聚合为列表,comments取分组内首行值:
import pandas as pd result_df = df.groupby(['Id', 'fomrid'], as_index=False).agg( List_values=('values', list), List_occ=('occ', list), comments=('comments', 'first') )
PySpark 环境
使用Spark内置的collect_list函数实现列表聚合,如需保持列表和原数据行顺序一致,可搭配排序逻辑使用:
基础版(不强制顺序)
from pyspark.sql import functions as F result_df = df.groupBy("Id", "fomrid").agg( F.collect_list("values").alias("List_values"), F.collect_list("occ").alias("List_occ"), F.first("comments").alias("comments") )
保持原行顺序版
from pyspark.sql import functions as F result_df = df.withColumn("sort_struct", F.struct("occ", "values")) \ .groupBy("Id", "fomrid") \ .agg( F.sort_array(F.collect_list("sort_struct")).alias("sorted_data"), F.first("comments").alias("comments") ) \ .select( "Id", "fomrid", F.expr("transform(sorted_data, item -> item.values)").alias("List_values"), F.expr("transform(sorted_data, item -> item.occ)").alias("List_occ"), "comments" )
内容的提问来源于stack exchange,提问作者amamagar
相关产品推荐
相关产品推荐

