如何为pandas DataFrame新增列基于两列匹配同表查找父操作ID
实现方案
直接通过组合键映射匹配即可实现需求,两种常用实现方式如下:
方案1:映射查找(适合万行以内数据,写法简洁)
首先基于全局唯一的Procedure+Operation组合构建和OperationID的映射字典,再逐行匹配父行对应ID,最后校验缺失父行的异常情况。
import pandas as pd import numpy as np # 假设你从数据库读取的DataFrame变量名为df # 1. 构建 (Procedure, Operation) -> OperationID 的全局唯一映射 op_id_map = df.set_index(['Procedure', 'Operation'])['OperationID'].to_dict() # 2. 匹配生成ParentOperationID列 df['ParentOperationID'] = df.apply( lambda row: np.nan if row['ParentProcedure'] == '' and row['ParentOperation'] == '' else op_id_map.get((row['ParentProcedure'], row['ParentOperation'])), axis=1 ) # 3. 校验是否存在找不到父行的异常数据 invalid_rows = df[ (df['ParentProcedure'] != '') & (df['ParentOperation'] != '') & df['ParentOperationID'].isna() ] if not invalid_rows.empty: raise ValueError(f"找到{len(invalid_rows)}条无匹配父行的记录,对应OperationID列表:{invalid_rows['OperationID'].tolist()}")
方案2:表连接(适合十万行以上大数据量,性能更高)
通过左连接的方式批量匹配,避免逐行遍历的性能损耗:
# 1. 构建父行匹配辅助表 parent_ref = df[['Procedure', 'Operation', 'OperationID']].rename( columns={ 'Procedure': 'ParentProcedure', 'Operation': 'ParentOperation', 'OperationID': 'ParentOperationID' } ) # 2. 左连接批量匹配父ID df = df.merge(parent_ref, on=['ParentProcedure', 'ParentOperation'], how='left') # 3. 把本身无父行(ParentProcedure和ParentOperation为空)的记录重置为NaN df.loc[ (df['ParentProcedure'] == '') & (df['ParentOperation'] == ''), 'ParentOperationID' ] = np.nan # 4. 异常校验逻辑和方案1一致 invalid_rows = df[ (df['ParentProcedure'] != '') & (df['ParentOperation'] != '') & df['ParentOperationID'].isna() ] if not invalid_rows.empty: raise ValueError(f"找到{len(invalid_rows)}条无匹配父行的记录")
两种方案都和你之前在Excel里用的INDEX+MATCH数组公式逻辑完全一致,针对你现在几千行的规模用第一种方案就足够,代码更简洁。
内容的提问来源于stack exchange,提问作者multipitch
相关产品推荐
相关产品推荐

