在树形结构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:
| ID1 | ID2 | ID3 | value | parent |
|---|---|---|---|---|
| a | NA | NA | 300 | 300 |
| a | 1 | NA | 50 | 300 |
| a | 2 | NA | 30 | 300 |
| b | NA | NA | 400 | 400 |
| b | 1 | NA | 60 | 400 |
| b | 1 | 1 | 20 | 60 |
这个方法逻辑清晰,不管你的树形结构再延伸几层,只要按照这个层级规则调整父键的生成逻辑,都能适用,而且字典映射的方式效率也很高~
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

