将DF1与DF2与if-else语句进行比较

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将DF1与DF2与if-else语句进行比较相关的知识,希望对你有一定的参考价值。

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

我想要做的是条件比较,如果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中的值。

答案

您可以减去两个数据帧并取绝对值,并使用带有[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

以上是关于将DF1与DF2与if-else语句进行比较的主要内容,如果未能解决你的问题,请参考以下文章

Scala - 如果 DF1 中的数据与 DF2 中的列匹配,则从 DF1 中删除记录 [重复]

比较两个 Dataframe 列并显示 df1 中可用的结果而不是 df2 [重复]

如何在熊猫中进行“(df1&not df2)”数据框合并?

在 df1 中删除也在 df2 中的行的可靠方法

如何基于相同的 ID 比较两个不同数据框中的日期列

如何根据2列比较PySpark中的2个数据帧?