Pandas如何删除动态获取的指定列子集内所有值均为0的行
功能实现说明
需求
对数据框dmt_clean做行过滤:如果某行在所有方案编号列下的取值都是0,就删除该行。方案编号列的数量会动态变化,不能手动写死列名。
数据样例
# dmt_clean原始样例 OptionNumber TradeCategory 4015-7 4017-7 4019-7 4025-7 4030-6 0 1 Doors - Exterior 280.226822 280.226822 280.226822 280.226822 280.226822 1 1 Hardware 175.99 175.54 184.25 226.49 267.82 2 1 Trim - Interior 1818.783178 1904.233178 2252.523178 2589.283178 3323.953178 3 70000 Trim - Interior 0 0 0 0 0 4 70002 Trim - Interior 0 0 0 0 0
实现代码
步骤1:动态匹配方案编号列
用正则匹配规则自动筛选出所有格式为四位数字-1位数字的方案列,不需要手动指定:
import re import pandas as pd # 列表推导式简化写法,替代原有循环 l_plan_cols = [c for c in dmt_clean.columns if re.search(r'\d{4}-\d{1}', c)]
步骤2:过滤全0行
判断每一行在所有方案列下的取值是否全为0,仅保留不全为0的行:
# ~ 是取反操作,all(axis=1)代表一行的所有值都为True(即所有列都等于0) dmt_clean = dmt_clean[~(dmt_clean[l_plan_cols] == 0).all(axis=1)]
逻辑验证
执行dmt_clean[l_plan_cols] == 0会得到布尔值数据框,样例如下:
4015-7 4017-7 4019-7 4025-7 4030-6 0 False False False False False 1 False False False False False 2 False False False False False 3 True True True True True 4 True True True True True 5 True True False True True 6 False False False True False
调用.all(axis=1)后,只有索引3、4的行返回True,取反后这两行会被过滤,其余行保留,符合需求。
内容的提问来源于stack exchange,提问作者jcrip
相关产品推荐
相关产品推荐

