
本文介绍如何使用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生态中的标准实践。










