【问题标题】:how to convert data into nested dictionary in python,dataframe如何在python,dataframe中将数据转换为嵌套字典
【发布时间】:2021-06-11 02:36:54
【问题描述】:

我有一个项目代码和组件的大型数据集,每个项目代码都与组件相关,进一步的组件成为另一个组件的项目代码。如何在python 中创建嵌套的dictionary

item code   component
a             q
b             w
c             r
d             t
e             y
q             u
q             v

想要的输出:-

{a:{q:[u,v]},b:w,c:r etc}

如何在python 中实现嵌套dictionary,我有大量数据 我使用了defaultdict,但它只给了我一个dictionary,而不是一个嵌套的dictionary

【问题讨论】:

  • 这需要 pandas+networkx
  • @Pygirl 我从未使用过networkx。你能告诉我如何使用networkx 来做到这一点吗?同时,我将尝试在纯 python 中执行此操作。
  • networkx怎么用,我从来没用过
  • 检查我的答案这是我能尝试的最好的。
  • @MayankPorwal:单独使用 networkx 不会有帮助,因为您仍然需要将结果后处理为上述给定格式。但是是的,Networkx 可以帮助我将路径作为每个节点的元组,我可以将其转换为上述格式。

标签: python pandas dictionary


【解决方案1】:
In [108]: df = pd.DataFrame({'item_code': list('abcdeqq'), 'component': list('qwrtyuv')})

In [109]: import networkx as nx

In [110]: g = nx.DiGraph([(k,v) for k,v in zip(df['item_code'], df['component'])])

In [111]: {k:v if len(v) > 1 else v[0] for k,v in nx.convert.to_dict_of_lists(g).items() if v}
Out[111]: {'a': 'q', 'q': ['u', 'v'], 'b': 'w', 'c': 'r', 'd': 't', 'e': 'y'}

【讨论】:

  • 这将与df.groupby(['item_code'])['component'].apply(list).to_dict() 相同
  • ...或类似于{a: [d for c,d in df.values if a==c] for a,b in df.values} 甚至更好但更长的{a: set(d for c,d in df.values if a==c) for a,b in df.values}
【解决方案2】:

使用 networkx 你可以得到类似的东西。基于这个answer,我能够找到这个解决方案:

import networkx
G = nx.DiGraph()
G.add_edges_from(df.values)

def comb_tup(li_tup):
    d = {}
    crnt = d  # memo the crnt subtree
    stck = []  # stack of (sub)trees along current path
    for k, v in li_tup:
        while stck and k not in crnt:
            crnt = stck.pop()
        if k not in crnt:
            crnt[k] = {}
        stck.append(crnt)
        crnt = crnt[k]
        crnt[v] = {}
    return d
    
final_di = {}
for node in G.nodes:
    vi = list(nx.dfs_edges(G,node))
    d = comb_tup(vi)
    if len(d.keys()):
        for k,v in d.items():
            final_di[k] = v

final_di:

{'a': {'q': {'u': {}, 'v': {}}},
 'q': {'u': {}, 'v': {}},
 'b': {'w': {}},
 'c': {'r': {}},
 'd': {'t': {}},
 'e': {'y': {}}}

如果你有这些数据:

   item_code    component
0   a           q
1   b           w
2   c           r
3   d           t
4   e           y
5   q           u
6   q           v
7   u           x

final_di:

{'a': {'q': {'u': {'x': {}}, 'v': {}}},
 'q': {'u': {'x': {}}, 'v': {}},
 'b': {'w': {}},
 'c': {'r': {}},
 'd': {'t': {}},
 'e': {'y': {}},
 'u': {'x': {}}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 2023-01-17
    • 2013-11-16
    • 2019-04-08
    • 2023-02-10
    • 2018-12-09
    相关资源
    最近更新 更多