You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:12:21