
本文介绍如何使用 pandas 对 dataframe 按某一列(如 name)分组,先去除重复项,再将另一列(如 series)聚合为无重复列表,最终输出符合 json 格式的嵌套字典。
在数据处理中,常需将扁平化的表格结构(如含重复组合的 Name-Series 关系)转换为层次化键值结构:以 Name 为键、对应去重后的 Series 值列表为值。这本质上是「分组→去重→聚合→序列化」四步操作。
最简洁高效的方式是结合 drop_duplicates() 与 groupby().agg(list):
import pandas as pd # 示例数据 df = pd.DataFrame({'Name': ['A', 'B', 'A', 'A', 'B'], 'Series': ['A1', 'B1', 'A2', 'A1', 'B2'] }) # 方案 1:先全局去重,再分组聚合(推荐)result = df.drop_duplicates().groupby('Name')['Series'].agg(list).to_dict() print(result) # 输出: {'A': ['A1', 'A2'], 'B': ['B1', 'B2']}
该方案逻辑清晰:drop_duplicates() 移除所有完全重复行(避免同一 Name-Series 多次出现),再通过 groupby(‘Name’)[‘Series’].agg(list) 将每个 Name 下的 Series 值聚合成列表,最后用 .to_dict() 转为标准 Python 字典——天然兼容 json.dumps()。
若需保留原始顺序但仅去重(不依赖全局去重),可改用 unique():
立即学习 “Python 免费学习笔记(深入)”;
# 方案 2:分组内去重(保持首次出现顺序)result = df.groupby('Name')['Series'].agg(lambda x: x.unique().tolist()).to_dict()
⚠️ 注意事项:
- 若 DataFrame 含多余列(如 ID、Timestamp),务必先用 df[[‘Name’, ‘Series’]] 显式选取目标列,避免 drop_duplicates() 因其他列差异误删有效组合;
- 如需结果中列表按字母或数值排序,可在聚合时嵌入 sorted():
result = df.groupby('Name')['Series'].agg(lambda x: sorted(x.unique().tolist()) ).to_dict() - 最终字典可直接用于 JSON 序列化:import json; json_str = json.dumps(result, indent=2)
此方法兼顾性能与可读性,适用于中等规模数据(百万行内),且无需额外依赖,是 Pandas 生态中的标准实践。