如何解决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
相关产品推荐
相关产品推荐

