Python Pandas 如何单步保留列名以x1或x4为前缀的列
问题根因
你之前的代码逻辑方向完全反了:df.columns.drop(传入列集合)的作用是从全部列里移除传入的那些列,你传入的恰恰是需要保留的x1/x4前缀列,自然会把目标列误删。要实现需求不需要走“反向删除”的绕路逻辑,直接匹配需要保留的列即可一步完成筛选。
可直接落地的单步实现
- 方案1:适配你原有使用习惯的正则匹配写法
直接用filter方法匹配符合规则的列,不需要额外做drop操作,代码为:df = df.filter(regex='^(x1|x4)')
其中正则的^锚定列名字符串的开头位置,避免误选列名中间包含x1/x4的列,(x1|x4)表示任意匹配两个前缀分支,完全符合你的筛选要求。 - 方案2:原生字符串匹配写法(性能更优)
调用pandas内置的列名字符串方法直接批量判断前缀,单步完成索引选择,代码为:df = df.loc[:, df.columns.str.startswith(('x1', 'x4'))]str.startswith()支持直接传入元组形式的多前缀规则,纯字符串匹配的计算效率高于正则,适合列数较多的DataFrame。 - 方案3:强制沿用你原有drop逻辑的写法
如果你一定要保持“删除无关列”的实现思路,只需修正需要删除的列的匹配范围即可,代码为:df = df.drop(columns=df.columns[~df.columns.str.startswith(('x1', 'x4'))])
该写法最终结果和前两个方案完全一致,但多了一次布尔反向判断的冗余步骤,不推荐优先使用。
小提示:如果存在列名前后带空格、前缀大小写不统一的情况,可以在列名字符串匹配链中追加
.str.strip().str.lower()做预处理,避免匹配失效。
内容的提问来源于stack exchange,提问作者StatsScared
相关产品推荐
相关产品推荐

