
本文介绍如何使用pandas对dataframe中指定列组合去重后,按主键(如name)聚合series值为无重复列表,并最终输出标准json兼容的字典结构。
在数据处理中,常需将扁平化的表格结构(如含重复项的Name-Series映射)转换为嵌套的键值结构——即每个唯一Name对应一个去重后的Series值列表,最终以Python字典(可直接json.dumps()序列化)形式呈现。核心步骤分为两步:去重 + 分组聚合。
✅ 推荐方案:drop_duplicates() + groupby().agg(list)
最简洁高效的方式是先全局去重,再按目标列分组并聚合为列表:
import pandas as pd
# 示例数据
df = pd.DataFrame({
'Name': ['A', 'B', 'A', 'A', 'B'],
'Series': ['A1', 'B1', 'A2', 'A1', 'B2']
})
# 去重后分组聚合 → 字典
result = df.drop_duplicates().groupby('Name')['Series'].agg(list).to_dict()
print(result)
# 输出: {'A': ['A1', 'A2'], 'B': ['B1', 'B2']}⚠️ 注意:drop_duplicates() 默认对整行去重,确保 (Name, Series) 组合唯一;若DataFrame含其他无关列(如ID、时间戳),建议显式筛选关键列: result = df[['Name', 'Series']].drop_duplicates().groupby('Name')['Series'].agg(list).to_dict()
? 替代方案:groupby().agg(lambda x: x.unique().tolist())
若需保留原始分组逻辑(例如后续需同时聚合多列),可直接在agg中调用unique():
result = df.groupby('Name')['Series'].agg(lambda x: x.unique().tolist()).to_dict()此方式不依赖前置去重,语义更明确(“每组内Series去重后转列表”),但性能略低于先全局去重再分组。
立即学习“Python免费学习笔记(深入)”;
? 进阶:排序与JSON导出
如需列表按字母/数值顺序排列,可在聚合时加入sorted():
result = df.groupby('Name')['Series'].agg(
lambda x: sorted(x.unique().tolist())
).to_dict()
# 输出: {'A': ['A1', 'A2'], 'B': ['B1', 'B2']}(已排序)最终结果为标准Python字典,可直接用于JSON序列化:
import json
json_str = json.dumps(result, indent=2)
print(json_str)
# {
# "A": ["A1", "A2"],
# "B": ["B1", "B2"]
# }✅ 总结:优先使用 df.drop_duplicates().groupby(...).agg(list).to_dict() —— 简洁、高效、可读性强;当需灵活控制每组去重逻辑或处理多列时,选用 x.unique().tolist() 方案。两者均能精准生成符合要求的嵌套JSON结构。










