
本文介绍多种删除 dataframe 中重复列的方法,重点解决因列索引误用导致误删的问题,并推荐使用 df.t.drop_duplicates().t 这一简洁可靠的方案。
本文介绍多种删除 dataframe 中重复列的方法,重点解决因列索引误用导致误删的问题,并推荐使用 df.t.drop_duplicates().t 这一简洁可靠的方案。
在 Pandas 中删除重复列是数据清洗的常见需求,但初学者常因混淆位置索引(iloc)与标签索引(columns)而出现意外行为——例如调用 dataframe.drop(dataframe.columns[duplicate_cols], axis=1) 时,若 duplicate_cols = [2, 4],本意是删除第 3 和第 5 列(0 起始),却可能因 DataFrame 列名非默认整数或索引未对齐导致逻辑错误,甚至误删首列。
最稳健、语义清晰的解决方案是利用 Pandas 内置的去重机制:对 DataFrame 进行转置(.T),在行维度(即原列维度)上执行 drop_duplicates(),再转置回原结构:
# 示例数据构建
import pandas as pd
df = pd.DataFrame({
'col0': [1, 2, 3, 4, 5],
'col1': [2.3, 2.3, 2.3, 2.3, 2.3],
'col2': [1, 2, 3, 4, 5], # 与 col0 完全相同 → 重复列
'col3': [2.5, 2.5, 2.5, 2.5, 2.5],
'col4': [1, 2, 3, 4, 5], # 与 col0 相同 → 重复列
'col5': [4.5, 4.5, 4.5, 4.5, 4.5]
})
# 删除重复列(保留首次出现的列)
df_clean = df.T.drop_duplicates().T
print(df_clean)
输出结果为:
col0 col1 col3 col5 0 1.0 2.3 2.5 4.5 1 2.0 2.3 2.5 4.5 2 3.0 2.3 2.5 4.5 3 4.0 2.3 2.5 4.5 4 5.0 2.3 2.5 4.5
该方法优势显著:
✅ 自动识别内容完全相同的列(不限于数值,支持字符串、布尔值等);
✅ 天然保留首次出现的列,符合“去重留一”直觉;
✅ 无需手动计算列索引或维护 duplicate_cols 列表,避免索引越界或错位风险;
✅ 代码简短、可读性强、无副作用。
⚠️ 注意事项:
- drop_duplicates() 默认基于所有列值严格匹配(keep='first'),如需自定义去重逻辑(如忽略 NaN、按特定子集判断),可在 .T.drop_duplicates() 中传入 subset 或 keep 参数;
- 若列中含不可哈希类型(如列表、字典),需先转换为可哈希形式(如 tuple)或改用逐列比对方式;
- 对超大宽表(数千列),转置操作内存开销略高,此时可考虑基于 pd.util.hash_pandas_object 批量哈希列值后去重。
总结:与其手动追踪重复列索引并调用 drop(),不如信任 Pandas 的向量化去重能力——df.T.drop_duplicates().T 是处理重复列的首选范式,兼顾正确性、简洁性与可维护性。










