比较两个数据帧中的列并删除df2中df1中值+/- 0.03范围内的行

时间:2017-09-14 15:35:57

标签: python-3.x pandas numpy

我有两个数据帧:

                A            B
     df1<-   45.5219       5.3179   
              0.9670       4.2212

                A            B
     df2<-    1.0000       5.3178   
              0.1922       4.7881   
              0.0395       4.5975   
              0.0813       4.2215

对于B列值,存在+/- 0.03的不确定性值,意味着df1 [5.3179]与df2 [5.3178]大致相同,并且df1 [4.2212]与df2的值相同[ 4.2215]。

因此,我想删除df2中与df1大致相同的B值的行(在+/- 0.03的误差范围内),并为df2生成如下所示的数据帧:

                A            B
     df2<-    0.1922       4.7881   
              0.0395       4.5975 

2 个答案:

答案 0 :(得分:4)

我知道NumPy broadcasting,所以这里有 ab 使用它 -

a = df1.values
b = df2.values
df2_out = df2[~(np.abs(a[:,None,:] - b[None]) <= 0.03).any(0).any(1)]

示例运行 -

In [119]: a = df1.values

In [120]: b = df2.values

In [121]: df2[~(np.abs(a[:,None,:] - b[None]) <= 0.03).any(0).any(1)]
Out[121]: 
        A       B
1  0.1922  4.7881
2  0.0395  4.5975

如果您希望仅与两个数据框中的B列进行比较 -

In [136]: df2[~(np.abs(df1.B.values[:,None] - df2.B.values) <= 0.03).any(0)]
Out[136]: 
        A       B
1  0.1922  4.7881
2  0.0395  4.5975

答案 1 :(得分:4)

使用Numpy Broadcastingnumpy.isclose的组合,通过0.03

的容差
v1 = df1.values
v2 = df2.values

df2[~np.isclose(v2, v1[:, None], .03).any(0).any(1)]

        A       B
1  0.1922  4.7881
2  0.0395  4.5975