关于python:np.where多个逻辑语句熊猫

np.where multiple logical statements pandas

我知道关于使用np.where.的链式逻辑运算符有很多问题

我有2个数据框:

1
2
3
4
5
6
7
8
9
10
11
df1
   A  B  C  D  E  F Postset
0  1  2  3  4  5  6     yes
1  1  2  3  4  5  6      no
2  1  2  3  4  5  6     yes

df2
   A  B  C  D  E  F Preset
0  1  2  3  4  5  6    yes
1  1  2  3  4  5  6    yes
2  1  2  3  4  5  6    yes

我想比较每个数据框中的行的唯一性。为此,我需要检查多个选定列的所有值是否相等。

从这个问题出发:如果我正在检查a b c d e f列,我可以这样做:

1
np.where((df1.A != df2.A) | (df1.B != df2.B) | (df1.C != df2.C) | (df1.D != df2.D) | (df1.E != df2.E) | (df1.F != df2.F))

正确给出:

1
(array([], dtype=int64),)

也就是说,两个数据帧的所有列中的值都独立相等。

这对于较小的数据框来说很好,但是我的实际数据框具有必须检查的大量列。 np.where条件太长,无法准确写出。

相反,我想将自己的列放入列表中:

1
columns_check_list = ['A','B','C','D','E','F']

并使用我的np.where语句自动对所有列执行检查。

这显然行不通,但是它是我要查找的表格类型。就像是:

1
check = np.where([df[column) != df[column] | for column in columns_check_list])

我该如何实现?

注意事项:

  • 我有很多专栏
  • 我的数据格式是固定的。
  • 列中的值可以包含stringsfloats


似乎您需要all来检查是否所有值都是每行Trueany如果至少一个值是每行True

1
2
3
mask= ~(df1[columns_check_list] == df2[columns_check_list]).all(axis=1).values
print (mask)
[False False False]

或更可读,谢谢IanS:

1
2
3
mask= (df1[columns_check_list] != df2[columns_check_list]).any(axis=1).values
print (mask)
[False False False]

也可以比较numpy array

1
2
3
mask= (df1[columns_check_list].values != df2[columns_check_list].values).any(axis=1)
print (mask)
[False False False]


您可以对比较的值使用np.logical_orreduce方法:

1
2
3
>>> import numpy as np
>>> np.logical_or.reduce((df1 != df2).values, axis=1)  # along rows
array([False, False, False], dtype=bool)               # each value represents a row

您可能需要在比较之前排除列:

1
(df1[include_columns_list] != df2[include_columns_list]).values

或之后:

1
(df1 != df2)[include_columns_list].values

除了np.logical_or之外,还有一个np.bitwise_or,但是如果您处理布尔值(并且比较返回布尔值数组),则这些等效。