如何用Python及Pandas创建嵌套字典/Collection Counter统计分组项?
如何在Python中按序列分组创建嵌套计数字典
你需要的是把两个序列按组聚合,统计每个组内各item的出现次数,完全不用手动遍历计数,Python有很多简便的实现方式,下面给你详细介绍几种:
方案1:标准库组合——collections.defaultdict + Counter
这是最直观也最高效的原生方案,代码清晰易懂,还能直接满足你的访问需求:
from collections import defaultdict, Counter seriesA = ["groupA", "groupA", "groupB", "groupB", "groupC"] seriesB = ["item1", "item1", "item3", "item1", "item2"] # 将两个序列配对成(组, 项)的元组列表 paired_items = zip(seriesA, seriesB) # 用defaultdict自动创建组对应的Counter,Counter负责计数 nested_counter = defaultdict(Counter) for group, item in paired_items: nested_counter[group][item] += 1 # 如果你需要普通字典而非defaultdict,只需转一下 nested_dict = dict(nested_counter) # 测试访问 print(nested_dict["groupA"]["item1"]) # 输出: 2 print(nested_dict) # 输出: {'groupA': Counter({'item1': 2}), 'groupB': Counter({'item3': 1, 'item1': 1}), 'groupC': Counter({'item2': 1})}
注:Counter是dict的子类,所以访问方式和普通字典完全一致,还自带most_common()等实用的计数方法。如果不需要这些额外功能,也可以把每个Counter转成普通字典:{k: dict(v) for k, v in nested_counter.items()}
方案2:一行式实现——itertools.groupby
如果追求代码简洁,可以用itertools.groupby,但要注意groupby要求输入是有序的,所以需要先按组排序:
from itertools import groupby from collections import Counter seriesA = ["groupA", "groupA", "groupB", "groupB", "groupC"] seriesB = ["item1", "item1", "item3", "item1", "item2"] # 先配对再按组排序,确保group能正确聚合 sorted_pairs = sorted(zip(seriesA, seriesB), key=lambda x: x[0]) # 分组后用Counter统计每组内的item数量 nested_dict = { group: Counter(item for _, item in group_items) for group, group_items in groupby(sorted_pairs, key=lambda x: x[0]) } print(nested_dict["groupB"]["item1"]) # 输出: 1
这个方法代码更紧凑,但因为多了排序步骤,数据量很大时效率会比方案1稍低,小数据量完全没问题。
方案3:Pandas实现(适合大数据场景)
如果你已经在使用Pandas处理数据,那这个方法会非常省心,直接得到普通嵌套字典:
import pandas as pd seriesA = ["groupA", "groupA", "groupB", "groupB", "groupC"] seriesB = ["item1", "item1", "item3", "item1", "item2"] # 转换成DataFrame df = pd.DataFrame({"group": seriesA, "item": seriesB}) # 按group和item分组计数,再转成嵌套字典 nested_dict = df.groupby(["group", "item"]).size().unstack(fill_value=0).to_dict("index") print(nested_dict["groupC"]["item2"]) # 输出: 1 print(nested_dict) # 输出: {'groupA': {'item1': 2}, 'groupB': {'item1': 1, 'item3': 1}, 'groupC': {'item2': 1}}
Pandas处理大规模数据的效率很高,而且输出就是标准的嵌套字典,不需要额外转换。
内容的提问来源于stack exchange,提问作者vinchinzu
相关产品推荐
相关产品推荐

