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

基于DataFrame两列构建不含空值子节点的树状字典方案咨询

嘿,这个需求很清晰,我来给你几个可行的实现方向,都是Python里常用的简洁方法:

核心思路

首先要过滤掉子节点为空的条目(也就是示例中France那条Child为空字符串的数据),再将剩余的国家-城市对应关系转换成树状字典。这里的“树状”如果是指「国家作为父节点,对应下属城市的集合」,那有两种常用实现方式:

方法一:兼容多城市的通用方案(推荐)

如果你的数据里可能存在一个国家对应多个城市的情况,用groupby来处理最稳妥,自动把同一国家的城市合并成列表:

import pandas as pd

# 原始数据
data = {'Parent':['Netherlands','Belgium','Germany','France'],'Child':['Amsterdam','Brussels','Berlin', '']}
df = pd.DataFrame(data)

# 1. 过滤空值:去掉Child为空字符串/纯空格的行,若有NaN可追加notna()判断
filtered_df = df[df['Child'].str.strip() != '']

# 2. 转换成树状字典:国家为键,对应城市列表为值
tree_dict = filtered_df.groupby('Parent')['Child'].apply(list).to_dict()

print(tree_dict)
# 输出结果:{'Belgium': ['Brussels'], 'Germany': ['Berlin'], 'Netherlands': ['Amsterdam']}

方法二:单城市场景的简洁方案

如果能确保每个国家只会对应一个城市,直接用dict(zip)就能快速生成字典:

# 过滤步骤同上
filtered_df = df[df['Child'].str.strip() != '']

# 直接生成键值对
tree_dict = dict(zip(filtered_df['Parent'], filtered_df['Child']))

print(tree_dict)
# 输出结果:{'Netherlands': 'Amsterdam', 'Belgium': 'Brussels', 'Germany': 'Berlin'}

进阶:更严格的树状层级结构

如果需要更标准的树状嵌套(比如父节点下明确标注子节点类型),可以用字典推导式构建:

filtered_df = df[df['Child'].str.strip() != '']

tree_dict = {
    row['Parent']: {'cities': [row['Child']]} 
    for _, row in filtered_df.iterrows()
}

print(tree_dict)
# 输出结果:
# {
#   'Netherlands': {'cities': ['Amsterdam']},
#   'Belgium': {'cities': ['Brussels']},
#   'Germany': {'cities': ['Berlin']}
# }
关键细节说明
  • 过滤空值时用str.strip()是为了处理那些只有空格的“伪空值”,如果你的数据里存在NaN类型的空值,可以把过滤条件改成:
    filtered_df = df[df['Child'].notna() & (df['Child'].str.strip() != '')]
    
  • groupby方法的优势是自动处理多城市场景,比如如果荷兰新增了鹿特丹(Rotterdam),会自动把两个城市放进同一个列表里,无需额外修改代码。

内容的提问来源于stack exchange,提问作者Sef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:32:30