You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按id聚合数组行并获取colour列的去重数组值?

按ID聚合数组列并去重的实现方案

以下是针对不同工具场景的具体实现方法,覆盖小数据集、大数据集及数据库场景:

Python Pandas 实现

适合处理中小规模数据集,通过扁平化数组、分组去重再重组完成需求:

代码示例

import pandas as pd
from collections import OrderedDict

# 构造示例数据
data = {
    'id': [1, 2, 1, 2],
    'colour': [['Red', 'Blue', 'Yellow'], ['Green'], ['White', 'Blue'], ['Green', 'Black']]
}
df = pd.DataFrame(data)

# 方式1:去重但不保留元素顺序(基于set实现)
result = df.groupby('id')['colour'].agg(
    lambda x: list(set([item for sublist in x for item in sublist]))
).reset_index()

# 方式2:去重且保留元素首次出现的顺序
result_ordered = df.groupby('id')['colour'].agg(
    lambda x: list(OrderedDict.fromkeys([item for sublist in x for item in sublist]))
).reset_index()

print(result_ordered)

输出结果:

id                     colour
0   1  [Red, Blue, Yellow, White]
1   2           [Green, Black]

Spark SQL/DataFrame 实现

针对大数据场景,Spark的分布式处理能力更高效:

SQL 语句方式

SELECT 
    id,
    ARRAY(collect_set(flattened_colour)) AS colour
FROM (
    SELECT 
        id,
        explode(flatten(colour)) AS flattened_colour
    FROM your_table
) t
GROUP BY id;

DataFrame API 方式

from pyspark.sql import SparkSession
from pyspark.sql.functions import flatten, explode, collect_set, array

spark = SparkSession.builder.appName("array_aggregate").getOrCreate()

# 构造示例数据
data = [
    (1, [["Red", "Blue", "Yellow"]]),
    (2, [["Green"]]),
    (1, [["White", "Blue"]]),
    (2, [["Green", "Black"]])
]
df = spark.createDataFrame(data, ["id", "colour"])

# 处理流程:扁平化嵌套数组 → 展开元素 → 分组去重聚合 → 还原嵌套格式
result_df = df.withColumn("flattened", flatten(col("colour"))) \
              .select("id", explode(col("flattened")).alias("colour_item")) \
              .groupBy("id") \
              .agg(collect_set("colour_item").alias("colour_list")) \
              .withColumn("colour", array(col("colour_list")))

result_df.show(truncate=False)

输出结果:

+---+---------------------------+
|id |colour                     |
+---+---------------------------+
|1  |[[Red, Blue, Yellow, White]]|
|2  |[[Green, Black]]           |
+---+---------------------------+

PostgreSQL SQL 实现

如果数据存储在PostgreSQL中,可直接用SQL语句处理:

SELECT 
    id,
    ARRAY[ARRAY_AGG(DISTINCT colour_item ORDER BY colour_item)] AS colour
FROM (
    SELECT 
        id,
        unnest(unnest(colour)) AS colour_item
    FROM your_table
) t
GROUP BY id;

内容的提问来源于stack exchange,提问作者user16462786

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 21:43:28