根据行值更改连接条件
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的值来使用第二个连接条件。
- 如果 df1.mandant 是 7 或 18 ( .isin([7,18]) ),第二个连接条件应该是这样的:
df1.mandant = df2.mandant
- 如果 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 %
我想与 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的值来使用第二个连接条件。
- 如果 df1.mandant 是 7 或 18 ( .isin([7,18]) ),第二个连接条件应该是这样的:
df1.mandant = df2.mandant
- 如果 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 %