【问题标题】:change join condition depending on row value根据行值更改连接条件
【发布时间】:2021-11-28 04:12:21
【问题描述】:

我想与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'))

【问题讨论】:

  • 您的mandant 字段是整数还是字符串存在混淆。您使用 .isin([7,18]) 暗示它是整数类型。但是再比较df2.mandant'00',暗示它是sting类型。

标签: python pandas dataframe join merge


【解决方案1】:

由于.merge()期间不能指定join条件,所以可以按照自己需要的条件过滤合并结果,如下:

案例 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]

案例 2:如果您的 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 %

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    相关资源
    最近更新 更多