pandas读取重复列名会自动添加“.1”后缀,易致后续操作错误;推荐先检测重复(df.columns.duplicated().any()),再用add_prefix批量加前缀以区分来源,而非依赖默认重命名。

重复列名导致 pd.read_csv 警告或数据错位
当 CSV 或 Excel 文件中存在重复列名(比如多个“score”、两个“id”),pandas.read_csv 默认会静默重命名为 score、score.1、score.2 等。这看似解决了问题,但实际容易引发后续操作出错——比如你写 df['score'] 只取到第一个,而 df[['score', 'score.1']] 又依赖字符串硬编码,极难维护。
更稳妥的做法是在读入时就主动区分,或读入后立即用 add_prefix 统一处理重复列。注意:add_prefix 本身不解决重复列识别问题,它只对已有列名批量加前缀,所以得先让重复列“显性化”。
- 读取时用
mangle_dupe_cols=False会直接报错(不推荐);默认True是安全的,但生成的.1后缀不可控 - 推荐先用
header=0读取原始列名,检查是否重复:df.columns.duplicated().any() - 若发现重复,可用
df.columns = pd.RangeIndex(len(df.columns))重置为数字索引,再调用add_prefix
add_prefix 对 DataFrame 列名批量加前缀的实际用法
add_prefix 是 DataFrame 方法,不是列名方法,它返回一个新 DataFrame,原地不修改。它对所有列名统一加前缀,不管是否重复——这点很关键:它不智能识别“哪些是重复列”,只是机械拼接。
常见误用是想只给重复列加前缀,但 add_prefix 没这个能力。必须先分离出重复列位置,再手动处理。
- 基础用法:
df_new = df.add_prefix('src1_')→ 所有列变成src1_colA、src1_colB - 如果只想处理部分列,得先切片:
df[['A','B']].add_prefix('part_'),再用pd.concat合并 - 前缀含特殊字符(如点号、空格)不影响,但可能影响后续点号访问(如
df.src1.id失效),建议用方括号取值
合并多个来源 DataFrame 时用 add_prefix 避免列名冲突
这是 add_prefix 最典型、最实用的场景:把来自不同表的同名列区分开,比如用户表和订单表都有 id 和 name,直接 pd.merge 会覆盖或报错。
正确顺序是:先分别加前缀,再合并。注意别漏掉索引列(如有),add_prefix 不影响索引。
users_prefixed = users_df.add_prefix('user_')orders_prefixed = orders_df.add_prefix('order_')- 合并时用
pd.merge(users_prefixed, orders_prefixed, left_on='user_id', right_on='order_user_id') - 如果原始列名含空格或破折号,加前缀后仍保留,但建议提前用
df.columns = df.columns.str.replace(r'[^a-zA-Z0-9_]', '_')清洗
为什么不用 rename 而选 add_prefix?性能与可维护性差异
rename 灵活但需显式映射,适合少量列定制;add_prefix 简单粗暴,适合整批处理,且底层是向量化操作,对宽表(数百列)更快。
真正容易被忽略的是:当你用 add_prefix 后又做 reset_index 或 set_index,新索引列不受影响;但若之后调用 df.T(转置),原列名变行名,add_prefix 就完全失效了——因为它是列轴专属方法。
- 列数少于 10 列:用
rename(columns=lambda x: f'src1_{x}')更直观 - 列数超过 50 列:
add_prefix减少拼写错误,也避免字典键遗漏 - 后续要导出为 JSON 或传给 SQLAlchemy 表定义时,带前缀的列名可能需二次清洗,别忘了这步
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











