如何筛选pandas DataFrame中所有数值列取值均为0的行
最优实现方案
不需要手动拼接20个列的查询条件,用pandas内置的批量判断逻辑即可实现,代码简洁且易维护。
方案1:按数据类型自动识别要校验的数值列
如果所有需要校验的列都是数值类型(整数、浮点数),且不存在其他不需要校验的数值类分类列(比如userId是整数但不需要校验的话不要用这个方案),可以直接用select_dtypes自动筛选数值列:
# 筛选所有数值列,判断每行所有值都为0 mask = df.select_dtypes(include=['int', 'float']).eq(0).all(axis=1) # 保留符合条件的行 result = df[mask]
方案2:手动指定要校验的数值列范围(更推荐,避免误判)
如果存在userId这类不需要校验的数值类型列,或者数值列有统一命名规则,可以先筛选目标列再判断:
# 方式A:如果数值列有统一前缀,直接按列名规则筛选 numeric_cols = [col for col in df.columns if col.startswith('numericColumn')] # 方式B:也可以手动列出来所有要校验的数值列 # numeric_cols = ['numericColumn1', 'numericColumn2', 'numericColumn3', ...] # 判断目标列每行所有值都为0 mask = df[numeric_cols].eq(0).all(axis=1) result = df[mask]
逻辑说明
eq(0):会对选中的所有列的每个元素判断是否等于0,返回相同形状的布尔值DataFrameall(axis=1):对每一行的布尔值做与运算,只有该行所有值都是True(即所有目标列都为0)时才返回True
两种方案不管有多少个数值列都可以正常运行,不需要手动修改逻辑,比拼接query条件的可维护性高很多。
内容的提问来源于stack exchange,提问作者usernameistaken777
相关产品推荐
相关产品推荐

