Apply the condition and count the True
values.
(df == 0).sum(1)
ID1 2
ID2 0
ID3 1
dtype: int64
df[(df == 0).sum(1) < 2]
col0 col1 col2 col3
ID2 1 1 2 10
ID3 0 1 3 4
Alternatively, convert the integers to bool and sum that. A little more direct.
# df[(~df.astype(bool)).sum(1) < 2]
df[df.astype(bool).sum(1) > len(df.columns)-2] # no inversion needed
col0 col1 col2 col3
ID2 1 1 2 10
ID3 0 1 3 4
For performance, you can use np.count_nonzero
:
# df[np.count_nonzero(df, axis=1) > len(df.columns)-2]
df[np.count_nonzero(df.values, axis=1) > len(df.columns)-2]
col0 col1 col2 col3
ID2 1 1 2 10
ID3 0 1 3 4
df = pd.concat([df] * 10000, ignore_index=True)
%timeit df[(df == 0).sum(1) < 2]
%timeit df[df.astype(bool).sum(1) > len(df.columns)-2]
%timeit df[np.count_nonzero(df.values, axis=1) > len(df.columns)-2]
7.13 ms ± 161 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
4.28 ms ± 120 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
997 μs ± 38.2 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…