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

如何在另一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:07:13