Python 熊猫基于关节条件切片行
考虑下面的dataframe-dfPython 熊猫基于关节条件切片行,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
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
的解决方案对给定数据集不起作用的原因似乎与数据类型问题有关,请参见此处