Pandas如何用LIKE筛选多列并保留列的原有关联顺序?
实现方案
问题现状
当前DataFrame列遵循字段类型_序号的命名规则,原始列顺序为:NAME_1, EMAIL_1, PHONO_1, POSTALCODE_1, NAME_2, EMAIL_2, PHONO_2, POSTALCODE_2, ……
目标是筛选NAME、EMAIL两类列,保持NAME_1, EMAIL_1, NAME_2, EMAIL_2……的相邻配对顺序,后续还要支持按序号拆分关联列为独立DataFrame。
之前尝试的两种方案问题如下:
- 直接用
&拼接两个filter返回值的写法不成立:df.filter(like=xxx)返回的是列名组成的子集,不是逐列的布尔掩码,无法做按位与运算 - 分类型筛选后横向拼接的方式,会把同类型列连续排列,打乱同序号列的配对顺序,无法满足需求
步骤1:按配对顺序筛选目标列
核心逻辑是先提取所有列的序号后缀,按序号从小到大排序,每个序号下依次取对应NAME、EMAIL列,从根源上保证列顺序符合配对要求,代码如下:
import pandas as pd # 提取所有列的数字后缀,去重后按数值大小升序排列 col_suffixes = sorted( {col.split("_")[-1] for col in df.columns if "_" in col}, key=lambda x: int(x) ) # 按序号依次拼接同组的NAME、EMAIL列,生成顺序正确的列名列表 target_columns = [] for suf in col_suffixes: target_columns += [f"NAME_{suf}", f"EMAIL_{suf}"] # 直接按列名列表取数,得到顺序符合要求的结果 df_pair = df[target_columns]
运行后df_pair的列顺序就是预期的NAME_1, EMAIL_1, NAME_2, EMAIL_2……。
步骤2:按序号拆分关联列为独立DataFrame
基于前面提取好的col_suffixes,直接循环遍历即可拆分出每个序号对应的独立DataFrame,支持按需保留同组其他字段(比如PHONO、POSTALCODE):
# 用字典存储拆分后的子DataFrame,key为序号,value为对应子表 df_dict = {} for suf in col_suffixes: # 列表里可以按需增删需要保留的同组字段 df_dict[suf] = df[[ f"NAME_{suf}", f"EMAIL_{suf}", f"PHONO_{suf}", f"POSTALCODE_{suf}" ]] # 调用示例:获取序号1对应的独立DataFrame df_1 = df_dict["1"]
该方案不依赖原始列的排列顺序,只要列名保持
字段名_数字序号的规则,就不会出现列错位、顺序错乱的问题,后续要新增筛选字段只需要往列名列表里加对应前缀即可,维护成本很低。
内容的提问来源于stack exchange,提问作者Gonza
相关产品推荐
相关产品推荐

