
本文介绍如何根据列名模式(如 A_1、A_2、B_1、B2)从源 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 中存在的列),硬编码列名列表或嵌套条件判断不仅易错,也缺乏可维护性。
推荐使用列表推导式 + 字符串前缀匹配的方式,简洁、高效且可扩展:
# 动态筛选所有以 'A_' 或 'B_' 开头的列
target_cols = [col for col in df_source.columns if col.startswith(('A_', 'B_'))]
df_new = df_source[target_cols].copy() # 安全复制,避免链式赋值警告
✅ 优势说明:
-
str.startswith()支持元组参数,可同时匹配多个前缀; - 无需预先判断
'A_2' in df_source.columns,自动跳过不存在的列; - 返回列顺序与源 DataFrame 中原始顺序一致(保持可预测性);
- 单行逻辑清晰,无副作用,适合管道化(如配合
.assign()或函数封装)。
⚠️ 注意事项:
- 确保列名严格区分大小写(如
'a_1'不会被匹配); - 若存在类似
'AA_1'或'AB_1'等干扰列,需改用正则匹配:import re target_cols = [col for col in df_source.columns if re.match(r'^(A|B)_\d+$', col)]
- 始终使用
.copy()显式创建新 DataFrame,防止后续修改意外影响原始数据。
总结:与其用条件分支反复重建 df_new,不如用声明式方式一次性生成目标列列表——这既是 Pandas 的惯用实践,也体现了“数据驱动逻辑”的工程思维。










