我有一本类似下面的字典。我想遍历并创建多级层次结构索引DataFrame。
d={1e-06: {1: {'conv': [1, 2.0, 2.0, 1]},
2: {'pool': [2.0, 2.0, 1, 1], 'stride': [1, 2.0, 2.0, 1]},
3: {'conv': [1, 2.0, 2.0, 1]},
4: {'pool': [2.0, 2.0, 1, 1], 'stride': [1, 2.0, 2.0, 1]}},
1e-05: {1: {'conv': [1, 2.0, 2.0, 1]},
2: {'pool': [2.0, 2.0, 1, 1], 'stride': [1, 2.0, 2.0, 1]},
3: {'conv': [1, 2.0, 2.0, 1]},
4: {'pool': [2.0, 2.0, 1, 1], 'stride': [1, 2.0, 2.0, 1]}}}
我正在研究一些方法,发现以下方法可行。
a_list=lambda d: [a_list(v) if isinstance(v,dict) else v for k,v in d.items()]
收益
pd.DataFrame(a_list(d))
0 1 \
0 [[1, 2.0, 2.0, 1]] [[2.0, 2.0, 1, 1], [1, 2.0, 2.0, 1]]
1 [[1, 2.0, 2.0, 1]] [[2.0, 2.0, 1, 1], [1, 2.0, 2.0, 1]]
2 3
0 [[1, 2.0, 2.0, 1]] [[2.0, 2.0, 1, 1], [1, 2.0, 2.0, 1]]
1 [[1, 2.0, 2.0, 1]] [[2.0, 2.0, 1, 1], [1, 2.0, 2.0, 1]]
但是,我不确定这是否是匿名功能lambda
的安全使用。
这种用法有任何不当之处吗?
任何人都可以提供有关递归的lambda
函数环境正在发生什么的任何详细信息吗?
继续该策略,以下代码创建了多层次的DataFrame。
如果字典的嵌套复杂度增加,我仍然想知道 是否可能出现问题。
代码
为多级索引创建元组
g = lambda d,q:[ g(v,q+[k]) if isinstance(v,dict) else {tuple(q+[k]):v} for
k,v in d.items()]
取消透视多余的列
g1 = pd.DataFrame.from_dict(
sum( #flatten vertically
sum( #flatten horizontally
g(d,[]),# call recursive lambda
[]),
[])
).melt().dropna() # unpivot
获取,创建,使用
g2 = list(g1['variable'])
index = pd.MultiIndex.from_tuples(g2)
g1.index = index
g1['value']
0.000001 1 conv [1, 2.0, 2.0, 1]
2 pool [2.0, 2.0, 1, 1]
stride [1, 2.0, 2.0, 1]
3 conv [1, 2.0, 2.0, 1]
4 pool [2.0, 2.0, 1, 1]
stride [1, 2.0, 2.0, 1]
0.000010 1 conv [1, 2.0, 2.0, 1]
2 pool [2.0, 2.0, 1, 1]
stride [1, 2.0, 2.0, 1]
3 conv [1, 2.0, 2.0, 1]
4 pool [2.0, 2.0, 1, 1]
stride [1, 2.0, 2.0, 1]