如何在python,dataframe中将数据转换为嵌套字典

Posted

技术标签:

【中文标题】如何在python,dataframe中将数据转换为嵌套字典【英文标题】:how to convert data into nested dictionary in 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 可以帮助我将路径作为每个节点的元组,我可以将其转换为上述格式。 【参考方案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': 

【讨论】:

以上是关于如何在python,dataframe中将数据转换为嵌套字典的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中将 Dictionary 项转换为多个 DataFrame?

如何在 pyspark 中将 DenseMatrix 转换为 spark DataFrame?

在Python DataFrame中将字符串转换为float64 [重复]

在 Python Pandas DataFrame 中将 timedelta64[ns] 列转换为秒

如何在 Spark 中将 JavaPairInputDStream 转换为 DataSet/DataFrame

在python中将对象数据类型转换为字符串问题