You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需循环删除Pandas DataFrame中名称含特定关键词的列(保留指定例外列)

如何无需循环删除Pandas DataFrame中名称含特定关键词的列(保留指定例外列)

嘿,非常认同你想「用正确方式做事」的想法!避免Python层面的循环,用Pandas原生的向量化操作确实是处理这类问题的最优解,尤其是当数据规模变大时,性能提升会特别明显。针对你的需求——删除所有名称含post的列,但保留post_title,这里有两个高效的无循环方案:

方案一:利用向量化布尔掩码筛选(推荐)

这是最直观且性能最优的方式,完全基于Pandas的向量化字符串操作,底层是C实现的,没有Python循环:

# 生成保留列的布尔掩码:要么列名不含'post',要么是'post_title'
keep_mask = ~df_web.columns.str.contains('post') | (df_web.columns == 'post_title')
# 按掩码筛选列
df_web = df_web.loc[:, keep_mask]

逻辑解释:

  • df_web.columns.str.contains('post'):检查每一列名是否包含'post',返回布尔数组
  • ~:对结果取反,得到「不含'post'的列」的掩码
  • | (df_web.columns == 'post_title'):加上例外条件,把'post_title'也加入保留列表
  • 最后用loc[:, keep_mask]直接筛选出需要保留的列

方案二:用正则表达式结合filter方法

如果你熟悉正则,也可以用filter的regex参数一步到位:

# 正则规则:要么不以'post'开头,要么就是'post_title'本身
df_web = df_web.filter(regex=r'^(?!post)|^post_title$', axis=1)

正则解释:

  • ^(?!post):匹配不以'post'开头的列名(负向前瞻断言)
  • ^post_title$:精确匹配'post_title'列
  • |:逻辑或,把两种情况的列都保留

和你原有方法的对比

你之前用的列表推导式本质还是Python层面的循环,当DataFrame有上百甚至上千列时,上面的向量化方法会比列表推导快很多;而且代码更简洁,可读性也更强。

用你给出的原始列列表测试,两种方案都会保留以下列:
['sku', 'total_sales', 'product_type', 'post_title', 'guid']

备注:内容来源于stack exchange,提问作者thalback

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 12:44:34