【问题标题】:np.where multiple logical statements pandasnp.where 多个逻辑语句 pandas
【发布时间】:2017-04-28 10:03:50
【问题描述】:

我知道关于使用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:如果我正在检查列abcdef我可以这样做:

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

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案1】:

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

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

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

    【讨论】:

    • (df1[columns_check_list] != df2[columns_check_list]).any(axis=1) 哪个更易读?
    • 为什么我总是忘记allany。这些可能更适合这种情况,因为它们可以使操作短路(只要没有差异,它们只处理行)。
    • 谢谢@jezrael。我完全忘记了np.anynp.all。它工作得很好。哦,也恭喜你获得 100k! :)
    【解决方案2】:

    您可以对比较的值使用np.logical_ors 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,但是如果您处理布尔值(并且比较返回一个布尔值数组),它们是等价的。

    【讨论】:

    • np.logical_or.reduce((df1 != df2)[columns_list].values, axis=1) ?
    猜你喜欢
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2012-03-25
    相关资源
    最近更新 更多