【问题标题】:Comparing Dataframe with different amount of rows and columns将 Dataframe 与不同数量的行和列进行比较
【发布时间】:2021-03-12 01:15:25
【问题描述】:

我有一个这样的数据框A:

CARD_NUMBER TRANSACTION_AMOUNT TERMINAL_ID EXTERNAL_STAN TRANSACTION_DATE
604861*********3947 40000 Y6152114 686817 21/01/2021 09:53:41
440833******4229 200000 Y6152114 686821 21/01/2021 10:04:05
425322******8727 200000 Y6152114 686847 21/01/2021 12:06:25
406606******7268 300000 Y6152114 207606 21/01/2021 15:16:33
425322******5923 300000 Y6152114 683213 21/01/2021 16:25:04

另一个数据框 B 如下所示:

MICROFILM_REF_NUMBER LINKUP_CODE REVERSAL_FLAG MCC TRANSACTION_AMOUNT TRANSACTION_CURRENCY TRANSACTION_CURRENCY_EXP TRANSACTION_DATE ISSUER_ID ISSUER_ICA ACQUIRER_ICA CLEARING_BIN ACQUIRER_BANK_CODE MERCHANT_NUMBER MERCHANT_COUNTRY_CODE MERCHANT_CITY_NAME MERCHANT_ACRONYM OUTLET_NUMBER TERMINAL_ID MERCHANT_TRANSACTION_SIGN ISSUER_BANK_CODE CLIENT_CODE CARD_NUMBER EXPIRY_DATE TRANSACTION_SIGN BILLING_AMOUNT BILLING_CURRENCY_EXP NETWORK_CODE SETTLEMENT_AMOUNT SETTLEMENT_CURRENCY SETTLEMENT_CURRENCY_EXP FUNCTION_CODE AUTHORIZATION_CODE AUTHORIZATION_DATE ACTION_CODE REFERENCE_NUMBER INTERNAL_STAN EXTERNAL_STAN
70000021024100188324015 AUTH10401003 N 6011 509,47 978 2 26/01/2021 18:39 515880 12658 12658 000003 710 CALENDAR GIRLS BOYS JOHANNESBURG ZA 000045 000045 C ISS003 0360835902 5158800746440660 01/01/2021 D 509,47 2 02 509,47 978 2 205 407309 26/01/2021 17:55 000 407309407309 670676 407309
70000021024100188324320 AUTH10401003 N 6011 3038,85 978 2 26/01/2021 17:59 515880 12658 12658 000003 710 CALENDAR GIRLS BOYS JOHANNESBURG ZA 000045 000045 C ISS003 0348497473 5158800034404519 01/01/2021 D 3038,85 2 02 3038,85 978 2 205 763004 26/01/2021 17:16 000 763004763004 456406 763004
70000021024100188324064 AUTH10401003 N 6011 6762,29 978 2 26/01/2021 18:12 515880 12658 12658 000003 710 CALENDAR GIRLS BOYS JOHANNESBURG ZA 000045 000045 C ISS003 0390027716 5158800663287854 01/01/2021 D 6762,29 2 02 6762,29 978 2 205 001532 26/01/2021 17:29 000 001532001532 536033 001532
70000021024100188324130 AUTH10401003 N 6011 431,87 978 2 26/01/2021 17:35 515880 12658 12658 000003 710 CALENDAR GIRLS BOYS JOHANNESBURG ZA 000045 000045 C ISS003 0360236142 5158800688202193 01/01/2021 D 431,87 2 02 431,87 978 2 205 258257 26/01/2021 16:52 000 258257258257 286480 258257

我想在数据框 A 中添加一列“匹配”,以便数据框 A 中存在的行之一在数据框 B 中退出,然后“匹配”为 True,否则为 False。

我还想生成一个包含匹配行数和不匹配行数的文件。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    解决您的问题的一种可能方法是使用 Pandas 提供的 merge 函数。如果您熟悉 SQL,这就像一个表连接。 pd.merge 通过检查两个数据框在列名称上的匹配位置将列从 df1 添加到 df2。这可以使用以下函数来完成:

    df3=df1.merge(df2, on=['col1','col2','col3'], how='left', indicator='Match')
    
            
    

    例如,如果 df1 是:

    FIRST_NAME LAST_NAME SALARY
    ahmed mobarki 20000.0
    mourad melodi 96000.0
    adam karimi 25000.0
    fatima barkaoui 30000.0
    david mahri 40500.0
    said melloki 96400.0
    ayoube sharfi 36420.0
    john salali 97500.0
    hajar mously 52400.0

    df2 被定义为:

    使用指示器执行左连接。

    df3 = df1.merge(df2, on=['FIRST_NAME','LAST_NAME','salary'], how='left', indicator='Match')
    

    设置indicator=Match 会在合并的DataFame 中添加一个名为Match 的列,其中每一行的值可以是三个可能值之一:left_only, right_only, or both

    我们对 Match 等于 both 时感兴趣,因为这意味着在两个 DataFrame 中都找到了观察合并键(然后我们会将 both 转换为 True,否则它将是 False) .

    df3['Match'] = df3['Match'] == 'both'
    

    df3 将如下所示:

    现在让我们回到您的数据框 A 和 B:

    C=A.merge(B, on=['CARD_NUMBER','TRANSACTION_AMOUNT','TERMINAL_ID', 'EXTERNAL_STAN', 'TRANSACTION_DATE'], how='left', indicator='Match')
    
    C['Match'] = C['Match'] == 'both'
    # create a new column Match in dataframe A  and fill it from C
    A["Match"] = C['Match']
    

    【讨论】:

      猜你喜欢
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 2020-06-15
      • 2015-04-20
      • 1970-01-01
      相关资源
      最近更新 更多