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

基于B类父ID补全DataFrame中A类父ID的技术实现问题

问题描述

现有如下结构的DataFrame:

A ID | A Parent ID | B ID | B Parent ID
1    | NA          | 11   | NA
2    | 1           | 12   | 11
3    | NA          | 13   | 11
4    | 2           | 14   | 12
5    | 2           | 15   | 12
6    | NA          | 16   | 12
7    | NA          | 17   | 13
8    | 3           | 18   | 13
9    | 6           | 19   | 16
10   | NA          | 20   | 17

需求:当B Parent ID不为空时,将A Parent ID填充为该行B Parent ID匹配的B ID所对应的A ID值,补全缺失的A类父ID,期望输出:

A ID | A Parent ID | B ID | B Parent ID
1    | NA          | 11   | NA
2    | 1           | 12   | 11
3    | 1           | 13   | 11
4    | 2           | 14   | 12
5    | 2           | 15   | 12
6    | 2           | 16   | 12
7    | 3           | 17   | 13
8    | 3           | 18   | 13
9    | 6           | 19   | 16
10   | 7           | 20   | 17

已尝试.loc、np.where、.map方法但未成功,且DataFrame约14万行,逐行迭代效率过低。

高效解决方案

用pandas矢量化操作处理,全程避免逐行循环,适合大数据集:

  1. 构建映射字典:从原DataFrame中提取B ID和对应A ID的关系,存成字典,方便快速查找
  2. 生成填充值:用B Parent ID去查字典,得到对应的A ID,作为填充用的值
  3. 补全缺失值:把A Parent ID里的空值替换成上面得到的填充值

代码实现

import pandas as pd
import numpy as np

# 构造示例数据(实际使用时替换成你的DataFrame)
data = {
    "A ID": [1,2,3,4,5,6,7,8,9,10],
    "A Parent ID": [np.nan,1,np.nan,2,2,np.nan,np.nan,3,6,np.nan],
    "B ID": [11,12,13,14,15,16,17,18,19,20],
    "B Parent ID": [np.nan,11,11,12,12,12,13,13,16,17]
}
df = pd.DataFrame(data)

# 步骤1:建立B ID到A ID的映射字典
b_id_to_a_id = df.set_index("B ID")["A ID"].to_dict()

# 步骤2:用B Parent ID映射出对应的A ID,得到填充列
fill_values = df["B Parent ID"].map(b_id_to_a_id)

# 步骤3:填充A Parent ID的缺失值
df["A Parent ID"] = df["A Parent ID"].fillna(fill_values)

# 查看结果
print(df)

说明

  • 映射字典的构建是一次性操作,时间复杂度O(n),效率极高
  • map和fillna都是pandas的矢量化方法,内部用C实现,处理14万行数据毫无压力
  • 只有当B Parent ID非空时,才会生成有效的填充值;如果B Parent ID为空,map后得到的是NaN,不会替换原A Parent ID的空值,符合需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:53:11