如果值不等于数字,如何从Pandas数据框中选择行?

Dri*_*ler 4 python pandas

我已经能够过滤包含数字的Pandas数据框行:

import pandas as pd    

df = pd.DataFrame({'c1': [3, 1, 2], 'c2': [3, 3, 3], 'c3': [2, 5, None], 'c4': [1, 2, 3]})

   c1  c2   c3  c4
0   3   3  2.0   1
1   1   3  5.0   2
2   2   3  NaN   3

df1 = df[(df.values == 1)]

   c1  c2   c3  c4
0   3   3  2.0   1
1   1   3  5.0   2
Run Code Online (Sandbox Code Playgroud)

但是,如果尝试基于排除数进行过滤,则重复行会得到一个非常奇怪的结果:

df1 = df[(df.values != 1)]

   c1  c2   c3  c4
0   3   3  2.0   1
0   3   3  2.0   1
0   3   3  2.0   1
1   1   3  5.0   2
1   1   3  5.0   2
1   1   3  5.0   2
2   2   3  NaN   3
2   2   3  NaN   3
2   2   3  NaN   3
2   2   3  NaN   3
Run Code Online (Sandbox Code Playgroud)

这是为什么?以及如何仅过滤不包含指定数字的行?

提前致谢!

And*_* L. 6

看这个面膜

In [88]: df.values != 1
Out[88]:
array([[ True,  True,  True, False],
       [False,  True,  True,  True],
       [ True,  True,  True,  True]])
Run Code Online (Sandbox Code Playgroud)

根据numpy约定进行切片。每个True都会重复,因此您在输出中有重复的行。您需要执行其他all检查所有行,True并为每行返回一个True / False。

df[(df.values != 1).all(1)]

Out[87]:
   c1  c2  c3  c4
2   2   3 NaN   3
Run Code Online (Sandbox Code Playgroud)

注意:我的意图是重用您的代码,所以我没有更改它。虽然代码应该简洁。

df[(df != 1).all(1)]
Run Code Online (Sandbox Code Playgroud)

要么

df[df.ne(1).all(1)]
Run Code Online (Sandbox Code Playgroud)


ans*_*sev 5

使用DataFrame.any

df[~df.eq(1).any(axis=1)]
Run Code Online (Sandbox Code Playgroud)

输出:

   c1  c2  c3  c4
2   2   3 NaN   3
Run Code Online (Sandbox Code Playgroud)