You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将带有父子层级的dataframe转换为父级名称分独立列存储的dataframe

层级位置DataFrame转宽表实现方案

你可以用pandas通过层级匹配实现转换,以下是两种可直接运行的实现方式:

方法1:递归匹配(适合小数据量,逻辑灵活)

思路:先标记每个节点的所属层级,从最底层的Taluk节点向上递归匹配所有父级节点信息,拼接为宽表。

import pandas as pd

# 预先构建编码-名称、编码-父节点的映射字典
name_mapping = df.set_index('Code')['Name'].to_dict()
parent_mapping = df.set_index('Code')['Parent'].to_dict()

# 标记每个节点的层级:1=国家 2=省/州 3=区县 4=乡镇/街道
def calc_level(code):
    level = 1
    current_parent = parent_mapping.get(code)
    while pd.notna(current_parent) and current_parent.strip() != '':
        level += 1
        current_parent = parent_mapping.get(current_parent)
    return level

df['level'] = df['Code'].apply(calc_level)

# 提取最底层Taluk节点作为基准,向上拉取所有层级信息
def get_full_hierarchy(taluk_code):
    info = {}
    current = taluk_code
    for col_prefix in ['Taluk', 'District', 'State', 'Country']:
        info[f'{col_prefix}_Name'] = name_mapping.get(current)
        info[f'{col_prefix}_Code'] = current
        current = parent_mapping.get(current)
    return pd.Series(info)

result = df[df['level'] == 4]['Code'].apply(get_full_hierarchy)
# 调整列顺序为目标格式
result = result[['Country_Name', 'Country_Code', 'State_Name', 'State_Code', 'District_Name', 'District_Code', 'Taluk_Name', 'Taluk_Code']]

方法2:多表合并(适合大数据量,性能更高)

思路:先拆分出各层级的子表,再通过父编码逐层关联得到全量层级信息。

import pandas as pd

# 同上先计算每个节点的层级
name_mapping = df.set_index('Code')['Name'].to_dict()
parent_mapping = df.set_index('Code')['Parent'].to_dict()
def calc_level(code):
    level = 1
    current_parent = parent_mapping.get(code)
    while pd.notna(current_parent) and current_parent.strip() != '':
        level += 1
        current_parent = parent_mapping.get(current_parent)
    return level
df['level'] = df['Code'].apply(calc_level)

# 拆分各层级子表
country = df[df['level'] == 1][['Code', 'Name']].rename(columns={'Code':'Country_Code', 'Name':'Country_Name'})
state = df[df['level'] == 2][['Code', 'Name', 'Parent']].rename(columns={'Code':'State_Code', 'Name':'State_Name', 'Parent':'Country_Code'})
district = df[df['level'] == 3][['Code', 'Name', 'Parent']].rename(columns={'Code':'District_Code', 'Name':'District_Name', 'Parent':'State_Code'})
taluk = df[df['level'] == 4][['Code', 'Name', 'Parent']].rename(columns={'Code':'Taluk_Code', 'Name':'Taluk_Name', 'Parent':'District_Code'})

# 逐层关联得到结果
result = taluk.merge(district, on='District_Code', how='left')\
              .merge(state, on='State_Code', how='left')\
              .merge(country, on='Country_Code', how='left')\
              [['Country_Name', 'Country_Code', 'State_Name', 'State_Code', 'District_Name', 'District_Code', 'Taluk_Name', 'Taluk_Code']]

如果你的数据存在层级不完整的情况,调整calc_level函数的判断逻辑和层级字段即可适配。

内容的提问来源于stack exchange,提问作者question.it

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:36:04