
本文介绍如何基于列名前缀(如 "A" 和 "B")动态提取匹配列,构建新 DataFrame,避免硬编码和重复赋值,支持任意数量的 _1, _2 等后缀变体。
本文介绍如何基于列名前缀(如 "a_" 和 "b_")动态提取匹配列,构建新 dataframe,避免硬编码和重复赋值,支持任意数量的 `_1`, `_2` 等后缀变体。
在实际数据处理中,常遇到列名具有统一前缀与可变后缀的结构化数据(如 A_1, A_2, B_1, B_2),而源 DataFrame 的列组合可能不固定。此时,硬编码列名列表或多次条件判断赋值不仅冗余,还易出错且难以维护。更优雅的做法是:先生成目标列名列表,再一次性索引构造新 DataFrame。
推荐使用 Pandas 的字符串向量化方法配合列表推导式,高效筛选列名。例如,要提取所有以 "A_" 或 "B_" 开头的列(无论后缀是 _1、 _2 还是 _3),可这样实现:
# 动态提取所有 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✅ 优势说明:
-
自动适配:无论
df_source包含A_1, B_1还是A_1, A_2, A_3, B_1, B_2,均能准确捕获; -
简洁安全:单次索引,无需
if分支或重复赋值; -
可扩展:如需加入
C_*,仅需修改元组('A_', 'B_', 'C_')即可。
⚠️ 注意事项:
-
startswith()接受元组作为参数(Python 3.6+),不可传入列表; - 若列名存在大小写混用(如
"a_1"),建议先标准化:df_source.columns.str.upper(); - 使用
.copy()显式创建视图副本,防止后续修改意外影响原始数据。
总结:与其用条件语句拼接列名列表,不如用声明式逻辑一次性生成目标列集合——这既是 Pandas 的惯用范式,也是提升代码健壮性与可读性的关键实践。

















