我已经能够过滤包含数字的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)
这是为什么?以及如何仅过滤不包含指定数字的行?
提前致谢!
看这个面膜
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)
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)
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |