根据行值更改连接条件

change join condition depending on row value

我想与 df1:

进行内部连接(合并)
mandant fk_lart_nr  fk_ust_sch
7   55  43
00  55  43

df2:

mandant ust_sch ust_bez
0   59  Gutschrift 19 %                                                                           
18  3   Rechnung 0 %                                                                              

我想使用两个连接条件。第一个总是固定的。

第一个加入条件是固定的df1.fk_ust_sch = df2.ust_sch

但是,应该根据df1.mandant的值来使用第二个连接条件。

  1. 如果 df1.mandant 是 7 或 18 ( .isin([7,18]) ),第二个连接条件应该是这样的:

df1.mandant = df2.mandant

  1. 如果 df1.mandant 不是 7 或 18,则第二个连接条件应该是使用 df2 的: df2.mandant == '00'
df_merged = df1.merge(df2, left_on=['fk_ust_sch'],
                                        right_on=['ust_sch'],
                                        how='inner', suffixes=('_df1', '_df2'))

由于在.merge()期间无法指定合并条件,您可以做的是根据您需要的条件过滤合并结果,如下所示:

情况 1:如果您的 mandant 字段是整数类型:

# Reuse your codes for merge
df_merged = df1.merge(df2, left_on='fk_ust_sch',
                           right_on='ust_sch',
                           how='inner', suffixes=('_df1', '_df2'))

# Filter
m1 = df_merged.mandant_df1.isin([7,18]) & (df_merged.mandant_df1 == df_merged.mandant_df2)
m2 = ~df_merged.mandant_df1.isin([7,18]) & (df_merged.mandant_df2 == 0)  ## use 0 instead of '00'

df_merged_filtered = df_merged.loc[m1 | m2]

情况二:如果你的mandant字段是字符串类型:

# Reuse your codes for merge
df_merged = df1.merge(df2, left_on='fk_ust_sch',
                           right_on='ust_sch',
                           how='inner', suffixes=('_df1', '_df2'))

# Filter
### Put 7, 18 in quotes as '7', '18'
m1 = df_merged.mandant_df1.isin(['7','18']) & (df_merged.mandant_df1 == df_merged.mandant_df2)
m2 = ~df_merged.mandant_df1.isin(['7','18']) & (df_merged.mandant_df2 == '00')

df_merged_filtered = df_merged.loc[m1 | m2]

演示

丰富您的示例数据以包含所有必需的测试用例:

(演示使用案例 1,您的 mandant 字段为整数类型)

输入数据

df1

   mandant  fk_lart_nr  fk_ust_sch
0        7          55          43
1        0          55          43
2       10          55          43


df2

   mandant  ust_sch          ust_bez
0        0       59  Gutschrift 19 %
1        6       43  Gutschrift 21 %
2        7       43  Gutschrift 30 %
3        0       43  Gutschrift 50 %
4       18        3     Rechnung 0 %

结果:

print(df_merged_filtered)

   mandant_df1  fk_lart_nr  fk_ust_sch  mandant_df2  ust_sch          ust_bez
1            7          55          43            7       43  Gutschrift 30 %
5            0          55          43            0       43  Gutschrift 50 %
8           10          55          43            0       43  Gutschrift 50 %