np.where多个逻辑语句pandas

时间:2017-04-28 10:03:50

标签: python pandas numpy dataframe

我知道使用np.where.

关于链式逻辑运算符的主题有很多问题

我有2个数据帧:

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

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

从此question开始:如果我正在检查列a b c d e f,我可以这样做:

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))

正确地给出了:

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

即。所有列中的值对于两个数据帧都是独立的。

对于小型数据帧来说这很好,但是我的真实数据帧有很多列我必须检查。 np.where条件太长,无法准确写出。

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

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

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

这显然不起作用,但它是我正在寻找的形式。类似的东西:

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

我怎样才能做到这一点?

考虑:

  • 我有很多专栏
  • 我的数据格式已修复。
  • 列中的值可能包含stringsfloats

2 个答案:

答案 0 :(得分:4)

您可以对比较值使用np.logical_or s reduce方法:

>>> 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

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

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

或之后:

(df1 != df2)[include_columns_list].values

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

答案 1 :(得分:4)

您似乎需要all来检查每行的所有值是True还是any,如果每行只有True个值:

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

或更具可读性,谢谢IanS

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

也可以比较numpy array s:

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