如何将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
相关产品推荐
相关产品推荐

