python - Pandas:如果多个列中的一个以上为零,则删除行
问题描述
我有一个这样的数据框:
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
只返回布尔值。
我觉得我在这里的第二次尝试很接近。
解决方案
应用条件并计算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)
推荐阅读
- typescript - Expo TypeScript 选项卡快照测试 App.tsx
- python - Discord.py 超时命令
- python - 使用弹性搜索中的另一个索引检查一个索引中的python值并创建一个新数据库
- postgresql - Postgres 如何计算 current_timestamp?
- spring-boot - 下载大型 zip 文件时出现异常 ClientAbortException: java.io.IOException
- .net - MapsterMapper 从接口映射到内部设置器属性
- map-force - 如何将值映射表中的值映射到异常?
- python - 数独算法生成重复值
- charts - 如何在 Google 条形图中分配条形颜色
- angular - 如何在Angular Kendo UI Treelist中从父行展开所有子行