Pandas检查任何不匹配的记录

2024-09-30 18:21:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试与以下条件匹配:

输入:

If df1['Cntr_No'] == df2['Cntr_No']
    check if df1['Total_Amount'] == df2['Total_Amount']
      else check if df1['Total_Amount'] == df2['Amount2'] or == df2['Amount3'] 

 If a match to create a new column "Match" with value = "Yes" or "No" for unmatched.

样本数据:

^{pr2}$

行中的示例输出:

    df1: HLBU 1234567 | df1: Total Amount: 100 | df2: HLBU 1234567 | df2: 
    Total Amount: 50 | df2: Amount 2: 40 | df2: Amount 3: 100 | Matched

Tags: ornoifcheck条件amountelsetotal
2条回答

我认为使用isin这很简单:

In [504]: df2['Check'] = ((df1.Cntr_No.isin(df2.Cntr_No))&((df1.Total_Amount.isin(df2.Amount_2))|(df1.Total_Amount.isin(df2.Amount_3))|(df1.Total_Amount.isin(df2.Total_Amount)))).map({True:'Match',False:'No'})

In [505]: df2
Out[505]: 
   Amount_2  Amount_3       Cntr_No  Total_Amount  Check
0        40       100  HLBU 1234567            50  Match

一种方法是使用字典映射,然后使用列表理解:

cols = ['Amount_2', 'Amount_3', 'Total_Amount']

d = {k: set(v.values()) for k, v in \
        df2.set_index('Cntr_No')[cols].to_dict(orient='index').items()}

df1['Check'] = [j in d.get(i, set()) for i, j in zip(df1['Cntr_No'], df1['Total_Amount'])]

df1['Check'] = df1['Check'].map({True: 'Match', False: 'No'})

结果:

^{pr2}$

相关问题 更多 >