Pandas如何根据df1.mandant取值动态调整内连接关联条件
pandas 动态条件双字段内连接实现方案
你可以通过两种方式实现需求,优先推荐第一种辅助键方案,性能更优:
方案1:构造动态匹配辅助键后双字段等值连接
核心逻辑是提前给df1生成第二个连接用的动态匹配字段,直接通过merge的双等值条件完成关联,不会产生冗余中间数据。
import pandas as pd # 第一步:统一两个表mandant字段的字符串类型,避免数字/字符串匹配失败 df1['mandant'] = df1['mandant'].astype(str) df2['mandant'] = df2['mandant'].astype(str) # 如果df2里的0需要对应df1的'00',可加这行补两位前缀:df2['mandant'] = df2['mandant'].str.zfill(2) # 第二步:给df1构造动态匹配用的mandant字段 df1['match_mandant'] = df1['mandant'].where( df1['mandant'].isin(['7', '18']), # 符合条件用原mandant '00' # 不符合条件固定用'00'匹配 ) # 第三步:双字段内连接 df_merged = df1.merge( df2, left_on=['fk_ust_sch', 'match_mandant'], right_on=['ust_sch', 'mandant'], how='inner', suffixes=('_df1', '_df2') ) # 可选:删除临时生成的辅助字段 df_merged = df_merged.drop(columns=['match_mandant'])
方案2:单条件merge后按规则过滤
适合小数据量场景,写法更直观,缺点是会先生成大量不符合条件的中间数据,大表性能差。
# 先按固定的ust相关条件完成关联 df_merged = df1.merge( df2, left_on=['fk_ust_sch'], right_on=['ust_sch'], how='inner', suffixes=('_df1', '_df2') ) # 按动态mandant条件过滤保留符合要求的行 cond_special = df_merged['mandant_df1'].isin(['7','18']) & (df_merged['mandant_df1'] == df_merged['mandant_df2']) cond_normal = ~df_merged['mandant_df1'].isin(['7','18']) & (df_merged['mandant_df2'] == '00') df_merged = df_merged[cond_special | cond_normal]
注意事项
- 必须提前统一两个表
mandant字段的数据类型,避免出现数字7和字符串'7'匹配失败的问题 - 如果df2中存储的mandant值
0对应你需要的'00',可以通过str.zfill(2)方法统一补两位前导零
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

