在Python中将一个数据帧中的每一行与另一个数据帧中的每一行进行比较

在Python中将一个数据帧中的每一行与另一个数据帧中的每一行进行比较,python,pandas,Python,Pandas,我有两个具有相同特性的不同数据帧 df1 df2 我想将df1中的每一行与df2中的每一行进行比较,并计算在特征值中发现的差异数量 在我的示例中,我们有2个数据帧,每个数据帧有2个实例。因此,将有4种比较 对于每个比较,我需要返回特性差异的数量。例如,如果我们将df1中的第一行与df2中的第一行进行比较,那么特征值将有2个差异 知道如何实现吗?如果我理解正确,一种方法是使用np.where(),分别计算每一个特性每行的差异数,并对这些数组求和: arr = np.where(df_1['Age'

我有两个具有相同特性的不同数据帧

df1

df2

我想将df1中的每一行与df2中的每一行进行比较,并计算在特征值中发现的差异数量

在我的示例中,我们有2个数据帧,每个数据帧有2个实例。因此,将有4种比较

对于每个比较,我需要返回特性差异的数量。例如,如果我们将df1中的第一行与df2中的第一行进行比较,那么特征值将有2个差异


知道如何实现吗?

如果我理解正确,一种方法是使用
np.where()
,分别计算每一个特性每行的差异数,并对这些数组求和:

arr = np.where(df_1['Age']!=df_2['Age'],1,0) + np.where(df_1['Country'] != df_2['Country'],1,0) + np.where(df_1['Income']!=df_2['Income'],1,0)
这将返回一个数组,其中包含每行的特征差异数。在这种情况下,输出为:

[2,2]
如果有许多列如以下示例中所示,则可以使用for循环:

df_1 = pd.DataFrame({'Age':[1,2,3,4],'Country':['Brazil','UK','Australia','China'],'Var_x':[7,5,7,7],'Var_y':[3,6,3,2],'Var_z':[20,32,31,34]}) 
df_2 = pd.DataFrame({'Age':[1,2,4,5],'Country':['Egypt','UK','India','China'],'Var_x':[7,4,3,7],'Var_y':[3,6,2,2],'Var_z':[20,32,4,32]})
differences = np.zeros(len(df_1))
for i in df_1:
  differences += np.where(df_1[i]!=df_2[i],1,0)
print(differences)
输出:

[1. 1. 5. 2.]

到目前为止,您尝试了什么?如果数据不太长,广播是最好的选择。这些数据帧的长度相同吗?数据帧的长度不同吗?使用for循环的第二个解决方案可以。但问题是,它仅比较df_1中的第一行与df_2中的第一行、df_1中的第二行与df_2中的第二行、df_1中的第三行与df_2中的第三行以及df_1中的第四行与df_2中的第四行。输出由4个数字组成。是的。但我真正需要的是取df_1中的第一行并将其与df_2中的所有行进行比较,然后取df_1中的第二行并与df_2中的所有行进行比较。等等我们应该有16个比较。输出将是一个16位的数组,而不仅仅是4位
df_1 = pd.DataFrame({'Age':[1,2,3,4],'Country':['Brazil','UK','Australia','China'],'Var_x':[7,5,7,7],'Var_y':[3,6,3,2],'Var_z':[20,32,31,34]}) 
df_2 = pd.DataFrame({'Age':[1,2,4,5],'Country':['Egypt','UK','India','China'],'Var_x':[7,4,3,7],'Var_y':[3,6,2,2],'Var_z':[20,32,4,32]})
differences = np.zeros(len(df_1))
for i in df_1:
  differences += np.where(df_1[i]!=df_2[i],1,0)
print(differences)
[1. 1. 5. 2.]