Skip to main content
 首页 » 编程设计

python之在多种条件下比较两个不同大小的数据帧

2025年05月04日14mq0036

<分区>

每当 DF1 中的 A、B、C 和 D 列与 DF2 匹配时打印“True”(在 DF1 中的新列“Test”中),否则打印“False”。

我的代码:

import pandas as pd 
import numpy as np 
 
DF1= pd.DataFrame({'A':['a','a','b','b','b','c','c','d'], 
                   'A1':['a11','a11','b11','b11','c11','c11','c11','d11'], 
                   'B':['a1','a2','b1','b2','b3','c1','c2','d1'], 
                   'C':[1,0,np.nan,2,3,1,3,5], 
                   'D':[2.5,4.3,7.2,13.1,3.0,6.2,3.8,78.5]}) 
 
DF2= pd.DataFrame({'A':['a','b','b','c','c'], 
                  'B':['a1','b1','b3','c1','c2'], 
                  'C':[1,np.nan,3,1,3], 
                  'D':[2.5,7.2,14.5,6.2,59.2]}) 
 
a_s = DF1['A'].unique().tolist() 
b_s = DF1['B'].unique().tolist() 
c_s = DF1['C'].unique().tolist() 
 
for i in a_s: 
    for j in b_s: 
        for k in c_s: 
 
            a1=DF1.loc[(DF1.A==i) & (DF1.B==j) & (DF1.C==k),'D'].values 
            b1=DF2.loc[(DF2.A==i) & (DF2.B==j) & (DF2.C==k),'D'].values 
 
            if (len(a1)!=0) & (len(b1)!=0): 
 
                if a1==b1: 
                    DF1.loc[(DF1.A==i) & (DF1.B==j) & (DF1.C==k),'Test'] = "True" 
                else: 
                    DF1.loc[(DF1.A==i) & (DF1.B==j) & (DF1.C==k),'Test'] = "False" 

结果:

    A   A1  B   C   D   Test 
0   a   a11 a1  1.0 2.5 True 
1   a   a11 a2  0.0 4.3 NaN 
2   b   b11 b1  NaN 7.2 NaN 
3   b   b11 b2  2.0 13.1    NaN 
4   b   c11 b3  3.0 3.0 False 
5   c   c11 c1  1.0 6.2 True 
6   c   c11 c2  3.0 3.8 False 
7   d   d11 d1  5.0 78.5    NaN 

问题:

<强> 1。代码很慢。
2. 当我必须测试更多列(比如 15 列)时,很难扩展代码。

编辑: 问题寻找答案:

    A   A1  B   C   D   Test 
0   a   a11 a1  1.0 2.5 True 
1   a   a11 a2  0.0 4.3 False 
2   b   b11 b1  NaN 7.2 True 
3   b   b11 b2  2.0 13.1    False 
4   b   c11 b3  3.0 3.0 False 
5   c   c11 c1  1.0 6.2 True 
6   c   c11 c2  3.0 3.8 False 
7   d   d11 d1  5.0 78.5    False