如何将具有父/子层次结构的数据框转换为在单独列中具有父名称的数据框?

Posted

技术标签:

【中文标题】如何将具有父/子层次结构的数据框转换为在单独列中具有父名称的数据框?【英文标题】:How to translate a dataframe with parent / child hierarchy into a dataframe with parent name in separate columns? 【发布时间】:2021-10-28 18:36:31 【问题描述】:

我有位置信息的数据框,其中包含 NameCodeParentName 字段包含所有 CountryStateDistrictTaluk 单个字段中的名称。

我想查看以下格式。

【问题讨论】:

【参考方案1】:

基于previous answer,您可以使用networkx 包来完成您想要的。这里唯一的区别是图表是倒置的,所以根 (Parent=NaN) 是一个叶子。

# Python env: pip install networkx
# Anaconda env: conda install networkx
import networkx as nx

# Create network from your dataframe
G = nx.from_pandas_edgelist(df, source='Code', target='Parent',
                            create_using=nx.DiGraph)

# Here, roots are the leaves of your graph
leaves = [node for node, degree in G.out_degree() if degree == 0]

# Find all paths
paths = []
for node in df['Code']:
    for leaf in leaves:
        path = nx.all_simple_paths(G, node, leaf)
        paths.append(list(reversed(*path))[1:]) # [1:] to remove nan

# Build your new columns
names = df.set_index('Code')['Name'].to_dict()
cols = ['Country', 'State', 'District', 'Taluk']
df1 = pd.DataFrame(paths, index=df.index, columns=cols).replace(names)

# Join your 2 dataframes
df = df.join(df1).fillna('')

输出:

>>> df
        Name    Code  Parent Country      State   District      Taluk
0      India      IN           India                                 
1  Karnataka   IN_KA      IN   India  Karnataka                      
2  Bangalore  KA_BNG   IN_KA   India  Karnataka  Bangalore           
3  Yelahanka  KA_YLH  KA_BNG   India  Karnataka  Bangalore  Yelahanka

【讨论】:

我在应用真实数据并弄清楚时遇到了一些问题。谢谢您的帮助。成功后会更新。

以上是关于如何将具有父/子层次结构的数据框转换为在单独列中具有父名称的数据框?的主要内容,如果未能解决你的问题,请参考以下文章

将所有子兄弟节点转换为类父节点

将字符串的所有字母字符转换为熊猫数据框中单独列中的整数

如何解压缩数据框列中存在的 json 的键,值将转换为键作为列,而使用 python 将其值转换为列?

如何将具有重复字段值的表格数据转换为层次结构的 JSON?

使用 python 将 Excel 中的按列 JSON 数据转换为层次结构

即使父视图可访问,子视图也不显示在层次结构中