
本文介绍如何基于列名模式(如 A_1、A_2、B_1、B_2)从源 DataFrame 中动态筛选 A* 和 B* 列,构建结构自适应的新 DataFrame,避免硬编码和重复赋值。
本文介绍如何基于列名模式(如 a_1、a_2、b_1、b_2)从源 dataframe 中动态筛选 a\* 和 b\* 列,构建结构自适应的新 dataframe,避免硬编码和重复赋值。
在实际数据处理中,常遇到列结构不固定但遵循命名规律的情况——例如源数据框 df_source 可能包含 A_1, B_1, C_1(基础三列),也可能扩展为 A_1, A_2, B_1, B_2, C_1, C_2(六列)。此时,若仅需提取所有以 "A_" 或 "B_" 开头的列(即 A_1, A_2, B_1, B_2),且希望结果 df_new 自动适配列数(2列或4列),不应依赖条件分支反复重赋值,而应采用更简洁、可扩展的列名过滤策略。
推荐使用列表推导式结合字符串匹配,一次性生成目标列名:
# 筛选所有以 "A_" 或 "B_" 开头的列名(按原始顺序保留)
target_cols = [col for col in df_source.columns if col.startswith(('A_', 'B_'))]
df_new = df_source[target_cols].copy() # 显式 copy 避免 SettingWithCopyWarning
该方法优势显著:
- ✅ 无需预判列是否存在:自动跳过不存在的
A_2/B_2,安全可靠; - ✅ 保持原始列序:
A_1,A_2,B_1,B_2的顺序与df_source.columns一致; - ✅ 高度可扩展:如需加入
C_*,只需修改元组('A_', 'B_', 'C_'); - ✅ 性能高效:单次遍历列名,无冗余索引操作。
⚠️ 注意事项:
- 避免使用
df_new[...] = ...追加列(如原问题中“不知如何添加”),这易触发SettingWithCopyWarning或意外修改源数据; - 若需严格按
A_1,B_1,A_2,B_2固定顺序(而非源顺序),可显式排序:import re target_cols = sorted([col for col in df_source.columns if col.startswith(('A_', 'B_'))], key=lambda x: (x.split('_')[0], int(x.split('_')[1])))
综上,基于列名模式的动态筛选应优先使用声明式列表推导,而非命令式条件分支——代码更简练、逻辑更清晰、维护性更强。










