如何在另一DataFrame中匹配值并填充当前DataFrame的OS cor字段?
解决DataFrame分场景匹配填充的问题
步骤1:提取Libellé中的10位数字
先给df新增临时列,提取Libellé字段里的10位连续数字,无有效数字时会返回NaN:
df['extracted_piece'] = df['Libellé'].str.extract(r'(\d{10})')
步骤2:预处理CP绝对值(匹配效率优化)
提前处理两个DataFrame的CP绝对值,避免后续重复计算:
# 给df_full新增CP绝对值列 df_full['CP_abs'] = df_full['CP'].abs() # 给df新增CP绝对值列 df['CP_abs'] = df['CP'].abs()
步骤3:构建映射关系并分场景填充
场景1:用提取的10位数字匹配No Piece FI + CP绝对值一致
先从df_full中构建匹配字典(重复匹配项取第一个结果,可根据需求调整keep参数):
match_map1 = df_full.drop_duplicates(subset=['No Piece FI', 'CP_abs'], keep='first') \ .set_index(['No Piece FI', 'CP_abs'])['OS'].to_dict()
给df中标记为flag且有有效提取数字的行填充OS cor:
mask_flag_valid_piece = df['flag'] & df['extracted_piece'].notna() df.loc[mask_flag_valid_piece, 'OS cor'] = df.loc[mask_flag_valid_piece].apply( lambda row: match_map1.get((row['extracted_piece'], row['CP_abs'])), axis=1 )
场景2:无有效提取数字时,用No Tiers SAP匹配 + CP绝对值一致
同样构建第二种场景的匹配字典:
match_map2 = df_full.drop_duplicates(subset=['No Tiers SAP', 'CP_abs'], keep='first') \ .set_index(['No Tiers SAP', 'CP_abs'])['OS'].to_dict()
给df中标记为flag、无有效提取数字且场景1未匹配成功的行填充OS cor:
mask_flag_no_piece = df['flag'] & df['extracted_piece'].isna() & df['OS cor'].isna() df.loc[mask_flag_no_piece, 'OS cor'] = df.loc[mask_flag_no_piece].apply( lambda row: match_map2.get((row['No Tiers SAP'], row['CP_abs'])), axis=1 )
步骤4:清理临时列(可选)
如果不需要临时辅助列,可执行删除:
df.drop(columns=['extracted_piece', 'CP_abs'], inplace=True) df_full.drop(columns=['CP_abs'], inplace=True)
内容的提问来源于stack exchange,提问作者Teddy
相关产品推荐
相关产品推荐

