Python中基于KO-STA/KO-PAR条件合并两个DataFrame的需求
解决DataFrame合并:处理键不完整的匹配需求
嘿,我来帮你搞定这个DataFrame合并的问题!根据你的描述,df1是200w+行的全量数据,每行都有完整的KO-STA和KO-PAR;df2是7w+行的结构化数据,行可能只含其中一个键。我们需要把df2的Need1和Need2匹配到df1中,核心思路是按匹配精度分优先级处理:先做双键精确匹配,再补全单键的匹配,具体方案如下:
步骤1:拆分df2为不同匹配类型的子集
首先把df2拆成三个部分,方便后续分阶段匹配:
import pandas as pd # 拆分df2:分别提取双键完整、仅含KO-STA、仅含KO-PAR的行 df2_both = df2.dropna(subset=['KO-STA', 'KO-PAR']) # 双键都有的行 df2_only_sta = df2.dropna(subset=['KO-STA']).loc[df2['KO-PAR'].isna()] # 仅KO-STA的行 df2_only_par = df2.dropna(subset=['KO-PAR']).loc[df2['KO-STA'].isna()] # 仅KO-PAR的行
步骤2:分优先级合并到df1
我们按「双键精确匹配 > 单键KO-STA匹配 > 单键KO-PAR匹配」的顺序来,确保最精确的匹配先生效,再补全剩余未匹配的行:
1. 双键精确匹配
先处理df2中同时有KO-STA和KO-PAR的行,这部分匹配最准确:
# 只保留df2中需要的列,减少合并的数据量 merge_cols = ['KO-STA', 'KO-PAR', 'Need1', 'Need2'] merged = pd.merge(df1, df2_both[merge_cols], on=['KO-STA', 'KO-PAR'], how='left')
2. 补全仅KO-STA的匹配
针对第一步后还没匹配到Need1/Need2的行,用KO-STA去匹配df2中仅含这个键的行:
# 筛选出还未匹配到Need1的行 mask_unmatched_sta = merged['Need1'].isna() # 合并并填充未匹配的部分 merged.loc[mask_unmatched_sta, ['Need1', 'Need2']] = merged.loc[mask_unmatched_sta].merge( df2_only_sta[['KO-STA', 'Need1', 'Need2']], on='KO-STA', how='left' )[['Need1_y', 'Need2_y']].values
3. 补全仅KO-PAR的匹配
最后处理剩下的未匹配行,用KO-PAR去匹配df2中仅含这个键的行:
# 筛选出仍未匹配到Need1的行 mask_unmatched_par = merged['Need1'].isna() # 合并并填充最后未匹配的部分 merged.loc[mask_unmatched_par, ['Need1', 'Need2']] = merged.loc[mask_unmatched_par].merge( df2_only_par[['KO-PAR', 'Need1', 'Need2']], on='KO-PAR', how='left' )[['Need1_y', 'Need2_y']].values
注意事项
- 优先级调整:如果你的业务逻辑中
KO-PAR的优先级更高,可以调换步骤2和步骤3的顺序 - 重复处理:如果df2中有多个行匹配同一个键组合,建议先对df2的子集去重,比如
df2_both = df2_both.drop_duplicates(subset=['KO-STA', 'KO-PAR'], keep='first'),避免重复匹配 - 性能优化:因为df1数据量很大,尽量只保留需要的列进行合并,减少内存占用和计算时间;如果你的数据有重复键,也可以提前对df1做去重处理
内容的提问来源于stack exchange,提问作者energyMax
相关产品推荐
相关产品推荐

