【问题标题】:Compare two dataframes' columns with tolerances将两个数据框的列与公差进行比较
【发布时间】:2020-04-17 15:38:45
【问题描述】:

我有两个数据框,我想逐行比较它们,并将结果存储在一个新的中。

我想要的是进行条件比较,如果 df1 中的值与 df2 中的值不同(或大于容差),我们希望将 df2 中的值复制到新数据框中。如果值相同(或在容差范围内),则在新数据框中返回 null。

对于每一列,我会添加一个容差: 年龄容忍度:3,工资容忍度:500,奖金容忍度:100

df1 = pd.DataFrame({'Age':[22,55,35],'salary':[1500,2000,1000],'bouns':[500,222,124]}) 
df2 = pd.DataFrame({'Age':[23,55,65],'salary':[1400,1000,3000 ],'bouns':[100,222,500]})

In [3]: df1 

   Age  salary   bonus
0  22    1500    500
1  55    2000    222
2  35    1000    124

In [3]: df2

   Age  salary   bonus
0   23   1400    100
1   55   1000    222
2   65   3000    500

输出应该是这样的:

In [4]: df3

   Age  salary   bonus
0                100
1        1000   
2   65   3000    500

我尝试使用 isclose 函数将两个数据帧中的值与特定容差进行比较。它工作正常。但它返回布尔值 true 或 false。

df3 = np.isclose(df1["Age"], df2["Age"], atol=3)

我想用if-else语句,所以如果条件为True,返回null,如果为False,返回df2中的值。

【问题讨论】:

标签: python pandas


【解决方案1】:

您可以减去两个数据帧并获取绝对值,并使用带有[3,500,100] 的列表来逐列查看哪些值高于公差。然后DataFrame.where将条件为False的值替换为空字符串:

df2.where(df2.sub(df1).abs().gt([3,500,100]), '')

  Age salary bouns
0              100
1       1000      
2  65   3000   500

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多