如何在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
相关产品推荐
相关产品推荐

