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

在树形结构DataFrame中查找各节点的直接父节点值

搞定树形DataFrame的父节点Value匹配

嘿,我来帮你解决这个问题!首先咱们得先理清楚每个节点的父节点到底对应哪一行,然后用pandas一步步实现:

先明确父节点的匹配规则

咱们先把每行的父节点逻辑捋明白:

  • 根节点:就是ID2和ID3全是NA的行(第1、4行),直接用自己的value当parent值
  • 中间节点:比如第2、3、5行,ID3是NA但ID2有值,它们的父节点是同ID1下、ID2和ID3都是NA的根节点
  • 叶子节点:比如第6行,ID3有值,它的父节点是同ID1、同ID2且ID3是NA的那一行(也就是第5行)

具体实现步骤

1. 先构造示例数据(如果你的数据已经存在可以跳过这步)

import pandas as pd

data = {
    'ID1': ['a', 'a', 'a', 'b', 'b', 'b'],
    'ID2': [pd.NA, 1, 2, pd.NA, 1, 1],
    'ID3': [pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, 1],
    'value': [300, 50, 30, 400, 60, 20]
}
mytable_df = pd.DataFrame(data)

2. 生成父节点的匹配键

咱们给每行生成一个能找到父节点的“标识键”,这样后续就能精准匹配了:

def get_parent_key(row):
    # 如果ID3有值,父节点是同ID1、同ID2且ID3为NA的行
    if pd.notna(row['ID3']):
        return (row['ID1'], row['ID2'], pd.NA)
    # 如果ID2有值但ID3没值,父节点是同ID1且ID2、ID3都为NA的根节点
    elif pd.notna(row['ID2']):
        return (row['ID1'], pd.NA, pd.NA)
    # 根节点的父键就是自己的键,直接匹配自己的value
    else:
        return (row['ID1'], row['ID2'], row['ID3'])

# 给DataFrame添加父键列
mytable_df['parent_key'] = mytable_df.apply(get_parent_key, axis=1)

3. 构建键到value的映射字典

把所有行的(ID1, ID2, ID3)组合和对应的value做成字典,这样查找父节点value会非常快:

key_to_value = mytable_df.set_index(['ID1', 'ID2', 'ID3'])['value'].to_dict()

4. 匹配父节点value并整理结果

用刚才生成的父键去字典里取值,就能得到parent列了,最后删掉临时的父键列就行:

mytable_df['parent'] = mytable_df['parent_key'].map(key_to_value)
mytable_df = mytable_df.drop('parent_key', axis=1)

# 打印看看结果
print(mytable_df)

最终输出结果

运行完上面的代码,你会得到想要的DataFrame:

ID1ID2ID3valueparent
aNANA300300
a1NA50300
a2NA30300
bNANA400400
b1NA60400
b112060

这个方法逻辑清晰,不管你的树形结构再延伸几层,只要按照这个层级规则调整父键的生成逻辑,都能适用,而且字典映射的方式效率也很高~


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:25:45