drop删列时列名不存在默认报KeyError,应加errors='ignore';推荐用columns=参数而非axis=1;删列后需df.copy()释放内存;正则删列需str.contains(na=False)配合布尔索引。

drop函数删列时列名不存在会报错
直接用 df.drop(columns=['col1', 'col2']) 删除列,如果其中某个列名(比如 'col2')根本不在 DataFrame 里,默认会抛出 KeyError。这不是 bug,是 pandas 的默认严格模式。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 加参数
errors='ignore':遇到不存在的列就跳过,不报错 —— 适合清洗脚本中“尽力删、删不着也不拦路”的场景 - 想确认哪些列真被删了?删之前先检查:
set(['col1', 'col2']) & set(df.columns) - 别用
inplace=True配合errors='ignore'来“静默试删”,容易掩盖列名拼写错误,后期难 debug
用axis=1还是columns参数?选哪个更安全
两种写法效果一样:df.drop(['A', 'B'], axis=1) 和 df.drop(columns=['A', 'B'])。但后者语义明确、不易误用。
实操建议:
立即学习“Python免费学习笔记(深入)”;
-
axis=1容易手滑写成axis=0(结果变成删行),尤其在快速复制粘贴时 -
columns=参数名自带提示,IDE 补全友好,也方便后续加errors=或inplace= - 如果要同时删行列(极少见),必须用
axis;日常纯删列,无脑用columns=
删列后索引没变,但内存没立刻释放
pandas 的 drop 默认返回新 DataFrame,原对象不动。但即使你赋值覆盖,比如 df = df.drop(columns=['temp']),Python 的引用计数机制和 pandas 内部缓存可能导致旧列数据暂时滞留内存。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 大表处理完立刻删列,紧接着调用
df = df.copy(),能强制触发底层数据重分配,释放冗余内存 - 避免链式操作如
df.drop(...).drop(...).reset_index(),中间对象不落地,GC 压力大;分步赋值更可控 - 用
df.info(memory_usage='deep')对比删列前后内存占用,别只看.shape
用正则批量删列名含特定模式的列
比如要删所有以 'tmp_' 开头或含 '_bak' 的列,drop 本身不支持正则,得靠布尔索引配合 str.contains()。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 写法是:
df.drop(columns=df.columns[df.columns.str.contains(r'^(tmp_|.*_bak$)')]) - 注意
str.contains()默认匹配子串,加^和$控制边界,否则'report'也会被'port'匹配中 - 正则失败时返回
NaN,导致布尔索引出错,加参数na=False:df.columns.str.contains(..., na=False)
print(list(df.columns)) 看一眼原始名字,比查文档快。










