【发布时间】:2017-08-18 23:35:59
【问题描述】:
试图将 pandas DataFrame 转换为字典。 Pandas 实用程序 to_dict 和 orient 选项似乎不足以解决这种情况。我当前的代码在某些情况下有效。
问题: 1. 有什么建议可以修改当前代码以使其看起来更优雅并且可能更快? 2.如何在这个场景中添加递归,使其适用于任意级别的嵌套。
fs = {'b1':{'f:ban':6, 'f:app':4}, 'b2':{'f:ban':4, 'f:app':2}}
dF = pandas.DataFrame.from_dict(fs, orient='index')
pandas.DataFrame.to_dict(dF, orient='index')
>>>{'b1': {'f:app': 4, 'f:ban': 6}, 'b2': {'f:app': 2, 'f:ban': 4}}
我希望它像这样存储,拆分键并分组/减少值:
{'b1': {'f': {'app': 4, 'ban': 6}}, 'b2': {'f': {'app': 2, 'ban': 4}}
我的代码适用于这种级别的嵌套,但是,可能有一种简洁的方法可以做到这一点。
原词典:
fruits = {'b1': {'f:app': 4, 'f:ban': 6}, 'b2': {'f:app': 2, 'f:ban': 4}}
首先定义一个辅助函数以从平面列表创建嵌套字典:
def create_nested_dict(L):
if len(L) == 2:
return {L[0]:L[1]}
while len(L) > 2:
d = {}
key = L[0]
L = L[1:]
d.update({key:create_nested_dict(L)})
return d
L = ['f', 'app','4']
create_nested_dict(L)
>>> {'f': {'app': '4'}}
然后使用上面的函数
new_fruits = {}
for key in fruits.keys():
_d = {key:{}}
for k,v in fruits[key].items():
L = k.split(':')
N = create_nested_dict(L + [v])
if list(N)[0] in list(_d[key]):
_d[key][list(N)[0]].update(N[list(N)[0]])
else:
_d[key].update(N)
new_fruits.update(_d)
print (new_fruits)
>>> {'b1': {'f': {'app': 4, 'ban': 6}}, 'b2': {'f': {'app': 2, 'ban': 4}}}
我的代码在以下情况下失败。注意额外的嵌套层次
fruits = {'b1': {'f:app:sim': 4, 'f:app:del': 3, 'f:ban:del': 6}, 'b2': {'f:app:sim': 2, 'f:app:del': 5, 'f:ban:del': 4}}
>>> {'b1': {'f': {'app': {'sim': 4}, 'ban': {'del': 6}}}, 'b2': {'f': {'app': {'sim': 2}, 'ban': {'del': 4}}}}
缺少一个键:值对 ...{'app': {'del': 3},..
【问题讨论】:
标签: python python-3.x pandas dictionary recursion