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

如何将Pandas多列分组生成的元组键字典转为层级嵌套字典?

将元组键的计数字典转换为层级嵌套字典(Pandas场景)

刚好碰到过类似的需求,我给你分享几种实用的实现方式:

首先先还原你的场景代码:

import pandas as pd

df = pd.DataFrame({'a': [1,1,1,1,2,2,2,2,3,3,3,3], 'b': [5,5,1,1,3,3,3,1,2,1,1,1,]})
count_dict = df.groupby(['a','b']).size().to_dict()
# 当前得到的字典:{(1, 5): 2, (3, 2): 1, (2, 3): 3, (3, 1): 3, (1, 1): 2, (2, 1): 1}

方法1:手动遍历构建(最直观)

这是最容易理解的方式,直接遍历元组键,逐层构建嵌套字典:

nested_dict = {}
for (key_a, key_b), count in count_dict.items():
    # 如果外层key不存在,先初始化一个空字典
    if key_a not in nested_dict:
        nested_dict[key_a] = {}
    # 赋值内层键值对
    nested_dict[key_a][key_b] = count

执行后就能得到你想要的结果:{1: {5: 2, 1: 2}, 2: {3: 3, 1: 1}, 3: {2: 1, 1: 3}}

方法2:用collections.defaultdict简化代码

如果不想写判断逻辑,可以用defaultdict来自动处理外层键的初始化:

from collections import defaultdict

nested_dict = defaultdict(dict)
for (k_a, k_b), cnt in count_dict.items():
    nested_dict[k_a][k_b] = cnt

# 要是需要把defaultdict转为普通字典,直接套个dict()就行
nested_dict = dict(nested_dict)

这种方式代码更简洁,省去了判断外层key是否存在的步骤。

方法3:字典推导式(一行实现,适合小数据量)

如果追求一行代码完成,可以用嵌套字典推导式,不过可读性和效率不如前两种,适合数据量小的场景:

nested_dict = {
    k_a: {k_b: cnt for (inner_k_a, k_b), cnt in count_dict.items() if inner_k_a == k_a}
    for k_a in {k_a for (k_a, _), _ in count_dict.items()}
}

推荐优先用前两种方法,尤其是方法1,新手也能一眼看懂逻辑。

内容的提问来源于stack exchange,提问作者Tony

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:07:03