Python 熊猫基于关节条件切片行

Python 熊猫基于关节条件切片行,python,pandas,numpy,Python,Pandas,Numpy,考虑下面的dataframe-df one two three four five six seven eight 0 0.1 1.1 2.2 3.3 3.6 4.1 0.0 0.0 1 0.1 2.1 2.3 3.2 3.7 4.3 0.0 0.0 2 1.6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3 0.1 1.2 2.5 3.7

考虑下面的dataframe-df

    one  two  three  four  five  six  seven  eight
0   0.1  1.1    2.2   3.3   3.6  4.1    0.0    0.0
1   0.1  2.1    2.3   3.2   3.7  4.3    0.0    0.0
2   1.6  0.0    0.0   0.0   0.0  0.0    0.0    0.0
3   0.1  1.2    2.5   3.7   4.4  0.0    0.0    0.0
4   1.7  2.1    0.0   0.0   0.0  0.0    0.0    0.0
5   2.1  3.2    0.0   0.0   0.0  0.0    0.0    0.0
6   2.1  2.3    3.2   4.3   0.0  0.0    0.0    0.0
7   2.2  0.0    0.0   0.0   0.0  0.0    0.0    0.0
8   0.1  1.8    0.0   0.0   0.0  0.0    0.0    0.0
9   1.6  0.0    0.0   0.0   0.0  0.0    0.0    0.0
我想选择所有任何列值为“3.2”的行,但同时所选行的值不应为“0.1”或“1.2”

我可以通过下面的查询得到第一部分

df[df.values == 3.2]
但不能将其与查询的第二部分(joint!=条件)组合

我还得到了以下错误

弃用警告:elementwise!=比较失败;这将在将来引发错误

在较大的数据集上(但不是在较小的复制副本上),尝试以下操作时

df[df.values != [0.1,1.2]]
//编辑:

@pensen,这是输出,第1行、第15行、第27行、第35行的值为“0.1”,但根据条件,它们应该被过滤

contains = df.eq(3.2).any(axis=1)
not_contains = ~df.isin([0.1,1.2]).any(axis=1)
print(df[contains & not_contains])
      0    1    2    3    4    5    6    7
1    0.1  2.1  3.2  0.0  0.0  0.0  0.0  0.0
15   0.1  1.1  2.2  3.2  3.3  3.6  3.7  0.0
27   0.1  2.1  2.3  3.2  3.6  3.7  4.3  0.0
31   3.2  0.0  0.0  0.0  0.0  0.0  0.0  0.0
35   0.1  1.7  2.1  3.2  3.6  3.7  4.3  0.0
以下是0:36行的原始数据集,用于复制上述输出

      0    1    2    3    4    5    6    7
 0   4.1  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 1   0.1  2.1  3.2  0.0  0.0  0.0  0.0  0.0
 2   0.1  2.4  2.5  0.0  0.0  0.0  0.0  0.0
 3   2.4  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 4   4.4  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 5   1.1  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 6   0.1  2.1  4.1  0.0  0.0  0.0  0.0  0.0
 7   4.4  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 8   1.7  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 9   2.2  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 10  1.1  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 11  1.1  4.1  0.0  0.0  0.0  0.0  0.0  0.0
 12  0.1  2.2  3.3  3.6  0.0  0.0  0.0  0.0
 13  0.1  1.8  3.3  0.0  0.0  0.0  0.0  0.0
 14  0.1  1.2  1.3  2.5  3.7  4.2  0.0  0.0
 15  0.1  1.1  2.2  3.2  3.3  3.6  3.7  0.0
 16  1.3  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 17  1.3  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 18  1.3  2.5  0.0  0.0  0.0  0.0  0.0  0.0
 19  0.1  1.2  2.5  3.7  4.4  0.0  0.0  0.0
 20  1.2  4.4  0.0  0.0  0.0  0.0  0.0  0.0
 21  4.3  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 22  1.1  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 23  0.1  2.2  2.4  2.5  3.7  0.0  0.0  0.0
 24  0.1  2.4  4.3  0.0  0.0  0.0  0.0  0.0
 25  1.7  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 26  0.1  1.1  4.1  0.0  0.0  0.0  0.0  0.0
 27  0.1  2.1  2.3  3.2  3.6  3.7  4.3  0.0
 28  1.4  2.2  3.6  4.1  0.0  0.0  0.0  0.0
 29  1.8  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 30  1.2  4.4  0.0  0.0  0.0  0.0  0.0  0.0
 31  3.2  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 32  3.6  4.1  0.0  0.0  0.0  0.0  0.0  0.0
 33  2.1  2.4  0.0  0.0  0.0  0.0  0.0  0.0
 34  0.1  1.8  0.0  0.0  0.0  0.0  0.0  0.0
 35  0.1  1.7  2.1  3.2  3.6  3.7  4.3  0.0

以下是实际数据集的示例,简而言之,您可以执行以下操作:

df.eq(3.2).any(axis=1) & ~df.isin([0.1, 1.2]).any(axis=1)
或者更明确地说:

contains = df.eq(3.2).any(axis=1)
not_contains = ~df.isin([0.1,1.2]).any(axis=1)

print(df[contains & not_contains])
   one    two    three    four    five    six    seven    eight
5  2.1    3.2    0.0      0.0     0.0     0.0    0.0      0.0
6  2.1    2.3    3.2      4.3     0.0     0.0    0.0      0.0

你可以把这些条件结合起来

>>> df[(df == 3.2).any(1) & ~df.isin([0.1, 1.2]).any(1)]

   one  two  three  four  five  six   seven  eight
5  2.1  3.2    0.0   0.0   0.0   0.0    0.0    0.0
6  2.1  2.3    3.2   4.3   0.0   0.0    0.0    0.0

为了提高性能,特别是因为您提到了大型数据集,并且如果您希望只排除两个数字,那么这里有一种处理数组数据的方法-

a = df.values
df_out = df.iloc[(a == 3.2).any(1) & (((a!=0.1) & (a!=1.2)).all(1))]
样本运行-

In [43]: a = df.values

In [44]: df.iloc[(a == 3.2).any(1) & (((a!=0.1) & (a!=1.2)).all(1))]
Out[44]: 
   one  two  three  four  five  six  seven  eight
5  2.1  3.2    0.0   0.0     0    0      0      0
6  2.1  2.3    3.2   4.3     0    0      0      0

当我在较大的数据集上运行此解决方案时,第二个条件不会被过滤(尽管不会引发错误)。我怀疑查询第二部分中的all(1)而不是any(1)会导致difference@SirajS. 这是一个有点有趣的观察结果。是否有未正确筛选的示例行?请注意,“all”在Divakar的示例中使用的方式不同,因为值0.1和1.2被逐个明确检查为不相等(这就是为什么使用all)。相反,在我的示例中,我只是检查这些值是否存在,然后反转结果。“两种方法应该得到相同的结果。”彭森,我在问题中添加了更多的数据。这应该允许复制。请忽略前面的评论。thankyou@SirajS. 奇怪的是,我用你更新的虚拟数据得到了正确的结果。只有第31行被正确过滤。你用什么版本?顺便说一句,我的尼克是潘森;-)使用
isin
的解决方案对给定数据集不起作用的原因似乎与数据类型问题有关,请参见此处