基于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矢量化操作处理,全程避免逐行循环,适合大数据集:
- 构建映射字典:从原DataFrame中提取
B ID和对应A ID的关系,存成字典,方便快速查找 - 生成填充值:用
B Parent ID去查字典,得到对应的A ID,作为填充用的值 - 补全缺失值:把
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
相关产品推荐
相关产品推荐

