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

如何解决Pandas GroupBy聚合多数据类型时的去重合并问题

问题

现有一个DataFrame,行大多是彼此的翻译版本(比如英文行和阿拉伯文行),它们共享location_shelfLocator标识符,需要基于该字段匹配合并行。部分列中不同语言行的值重复(比如语言列两条记录都是['ger']),合并后要去除重复值。

原使用代码:

df_merged = df_filled.groupby("location_shelfLocator").agg(
    lambda x: np.unique(x.tolist())
)

当列内值类型一致(全字符串或全数组)时代码正常运行,但当列同时存在字符串和数组时会触发警告:

FutureWarning: ['subject_name_namePart'] did not aggregate successfully. If any error is raised this will raise in a future version of pandas. Drop these columns/ops to avoid this warning.
  df_merged = df_filled.groupby("location_shelfLocator").agg(lambda x: np.unique(x.tolist()))

且问题列会被从最终DataFrame中移除。需要实现兼容列表、字符串及混合类型的合并去重。

示例数据:

location_shelfLocator,language_languageTerm,subject_topic,accessCondition,subject_name_namePart
81055/vdc_100000000094.0x000093,ara,"['فلك، العرب', 'فلك، اليونان', 'فلك، العصور الوسطى', 'الكواكب']",المُلكية العامة,كلاوديوس بطلميوس (بطليمو)
81055/vdc_100000000094.0x000093,ara,"['Astronomy, Arab', 'Astronomy, Greek', 'Astronomy, Medieval', 'Constellations']",Public Domain,"['Claudius Ptolemaeus (Ptolemy)', ""'Abd al-Raḥmān ibn 'Umar Ṣūfī""]"

期望输出:

location_shelfLocator,language_languageTerm,subject_topic,accessCondition,subject_name_namePart
"[‘81055/vdc_100000000094.0x000093’] ",[‘ara’],"['فلك، العرب', 'فلك، اليونان', 'فلك، العصور الوسطى', ‘الكواكب’, 'Astronomy, Arab', 'Astronomy, Greek', 'Astronomy, Medieval', 'Constellations']","[‘المُلكية العامة’, ‘Public Domain’]","[‘كلاوديوس بطلميوس (بطليمو)’,’Claudius Ptolemaeus (Ptolemy)', ""'Abd al-Raḥmān ibn 'Umar Ṣūfī""]"
解决方案

问题核心是np.unique无法直接处理混合字符串与列表的集合,需先统一将所有元素转换为可迭代序列,再合并去重。自定义聚合函数即可解决:

import pandas as pd

def merge_deduplicate(x):
    all_items = []
    for item in x:
        # 区分列表/数组与字符串,统一拆解为单个元素
        if isinstance(item, (list, pd.core.arrays.PandasArray)):
            all_items.extend(item)
        else:
            all_items.append(item)
    # 去重并保留原始出现顺序
    unique_items = list(dict.fromkeys(all_items))
    return unique_items

# 执行分组聚合,保留location_shelfLocator为普通列
df_merged = df_filled.groupby("location_shelfLocator", as_index=False).agg(merge_deduplicate)

代码说明

  • 类型统一处理:遍历列内每个元素,将列表/数组直接拆解扩展,字符串直接添加,避免混合类型导致的报错。
  • 有序去重:用dict.fromkeys实现去重同时保留元素原始出现顺序(若无需顺序,可替换为list(np.unique(all_items)))。
  • 索引格式控制:添加as_index=False,确保location_shelfLocator作为普通列存在,匹配期望输出结构。

该函数可兼容混合类型列,正确合并翻译内容并去除重复值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:25:21