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

如何在Pandas中以通用方式筛选指定列含匹配值的行?

通用解决方案:动态列下筛选符合条件的行

完全懂你的困扰——硬编码列名实在太麻烦,尤其是列数或列名变动的时候,每次改代码简直是重复劳动。这里有两个简洁的通用方法,完美适配你的需求:

方法一:apply + any(直观易读,新手友好)

先动态获取所有Y_开头的列,再逐行检查这些列里是否有值以X_开头,只要满足任意一列就保留该行:

import pandas as pd

# 你的示例DataFrame
df = pd.DataFrame([
 ['sd', 'X_dsa', 'sd', 'ad'],
 ['X_ds', 'ad', 'dsd', 'asd'],
 ['ase', 'asd', 'asd', 'asd'],
 ['agr', 'aee', 'X_sa', 'atd']
], columns=['Y_aa', 'Y_ab', 'cc', 'dd'])

# 第一步:动态筛选Y_开头的目标列
filtered_columns = df.filter(regex=r"^Y_.*").columns

# 第二步:通用过滤逻辑,无需硬编码列名
desired_output = df[df[filtered_columns].apply(lambda col: col.str.startswith('X_')).any(axis=1)]

print(desired_output)

运行结果和你预期的完全一致:

Y_aa   Y_ab   cc   dd
0    sd  X_dsa   sd   ad
1  X_ds     ad  dsd  asd

逻辑拆解:

  • df[filtered_columns]:精准选中所有Y_开头的列,不管后续新增多少这类列都不用改代码
  • apply(lambda col: col.str.startswith('X_')):对每一列的所有值做前缀检查,返回一个全是布尔值的DataFrame
  • .any(axis=1):按行判断,只要该行有一个True(也就是任意目标列符合条件),就保留该行

方法二:stack + groupby(大数据量更高效)

如果你的DataFrame行数特别多,这个方法的性能会更出色:

desired_output = df[df[filtered_columns].stack().str.startswith('X_').groupby(level=0).any()]

逻辑拆解:

  • stack():把目标列的所有值转成一个Series,原行索引会被保留为多级索引的第一级
  • str.startswith('X_'):逐个检查每个值是否符合前缀要求
  • groupby(level=0).any():按原行索引分组,只要组内有一个符合条件的值,就标记该行为True
  • 最后用这个布尔Series过滤原DataFrame,得到最终结果

这两个方法都彻底摆脱了硬编码列名的限制,不管Y_开头的列是2个还是20个,都能自动适配,完美解决你列数变化时频繁改代码的痛点。

内容的提问来源于stack exchange,提问作者ltyrvol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:13:57