Pandas:如果多列中的多个列为零,则删除行

问题描述 投票:2回答:2

我有一个数据帧:

     col0   col1  col2  col3
ID1    0      2     0     2
ID2    1      1     2     10
ID3    0      1     3     4

我想删除多次包含零的行。

我试过这样做:

cols = ['col1', etc]
df.loc[:, cols].value_counts()

但这仅适用于系列而非数据帧。

df.loc[:, cols].count(0) <= 1

只返回bools。

我觉得我很接近第二次尝试。

python pandas
2个回答
5
投票

应用条件并计算True值。

(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

或者,将整数转换为bool并将其相加。更直接一点。

# 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

为了性能,您可以使用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)

3
投票

运用

df.loc[df.eq(0).sum(1).le(1),]
     col0  col1  col2  col3
ID2     1     1     2    10
ID3     0     1     3     4

一个有趣的方式

df.mask(df.eq(0)).dropna(0, thresh=df.shape[1] - 1).fillna(0)
     col0  col1  col2  col3
ID2   1.0     1   2.0    10
ID3   0.0     1   3.0     4    
© www.soinside.com 2019 - 2024. All rights reserved.