最稳妥的列交换方式是reindex(columns=新列名列表),它不依赖原始顺序、保留dtype、避免命名歧义;需传入完整列名列表且拼写严格一致,重复列名会报错。

用 reindex 交换两列最稳妥
直接改 columns 顺序容易出错,尤其当列名重复或含空格时。reindex 是 Pandas 官方推荐的列重排方式,它不依赖原始顺序,只按你给的列表重建列结构。
- 必须传入完整列名列表(不能只写要交换的两列),否则缺失列会变成
NaN - 列名拼写必须完全一致,大小写、空格、下划线一个都不能错
- 如果原 DataFrame 有重复列名,
reindex会报ValueError: cannot reindex from a duplicate axis
比如想把 'A' 和 'C' 位置互换:
df = df.reindex(columns=['C', 'B', 'A', 'D'])
用双括号加列表切片快速交换相邻列
如果只是想把第 2 列和第 3 列(索引为 1 和 2)对调,用位置索引比列名更直接,也避开命名歧义问题。
- 适用于列名不规范(如含空格、点号)、或临时调试场景
- 注意:
df.columns.tolist()返回的是视图,修改后需重新赋值给columns,但更推荐直接用双括号选列 - 错误写法:
df[:, [0,2,1,3]]——DataFrame不支持 NumPy 式切片
正确做法:
df = df[[df.columns[0], df.columns[2], df.columns[1], df.columns[3]]]
iloc + columns 组合在循环中易踩坑
有人想用 iloc 提取列再拼接,比如 pd.concat([df.iloc[:, :1], df.iloc[:, 2:3], df.iloc[:, 1:2]], axis=1)。这看似灵活,实际埋了三个雷:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 列名丢失:
iloc返回的是无名列,拼接后列名变成0, 1, 2... - 索引对齐开销大:每次
iloc都触发拷贝,大数据量时明显变慢 - 列数变动时代码脆:加一列就得手动改所有切片范围
真要动态交换,优先用 reindex 配合列表生成逻辑,比如:
cols = df.columns.tolist()<br>cols[1], cols[2] = cols[2], cols[1]<br>df = df.reindex(columns=cols)
交换后索引类型可能意外改变
看起来只是调换顺序,但如果你的原始列里有 datetime64 或 categorical 类型,用某些方法(比如先 pop 再 insert)可能导致 dtype 降级成 object。
- 用
reindex或双括号选列能保留原有 dtype - 交换后务必检查:
df.dtypes,尤其注意时间列是否变回字符串 - 如果用了
assign拼新 DataFrame,旧列的categorycodes 可能被重置
最保险的验证方式:
print(df.dtypes.equals(original_df.dtypes)) # 应该输出 True
列顺序调整看着简单,但 Pandas 的列操作背后绑着索引对齐、dtype 推断、内存视图这些隐性机制。稍不注意,表面没报错,结果里就混进了 object 类型的时间字段,或者 merge 时因列名大小写不一致静默失败。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










