drop默认不修改原数据,需inplace=True或赋值;删多列须用列表;axis=1不可省略;del可原地删单列但无条件筛选功能。

drop 方法不加 inplace=True 默认不改原数据
很多人写 df.drop('col_name', axis=1) 后发现 df 没变,以为方法失效。其实 drop 默认返回新 DataFrame,原对象完全不动。
实操建议:
- 要真删原数据,必须显式加
inplace=True:df.drop('col_name', axis=1, inplace=True) - 不加
inplace时,记得赋值:df = df.drop('col_name', axis=1) -
inplace=True在某些链式操作中会报错(比如df.drop(...).reset_index()),这时只能走赋值路线
删除多列时传列表,别传字符串
想删 'a' 和 'b' 两列,写成 df.drop('a', 'b', axis=1) 会报错:TypeError: drop() takes 2 positional arguments but 3 were given。
实操建议:
- 多列必须用列表:
df.drop(['a', 'b'], axis=1, inplace=True) - 列名含空格或特殊字符?确保列表里字符串完全匹配,比如
['user id', 'score_v2'] - 用
df.columns.tolist()先确认真实列名,避免肉眼误判
axis=1 是关键,漏写就删错方向
忘记写 axis=1,drop 默认按行删(axis=0),结果整行消失,还找不到哪列被“删”了。
常见错误现象:
- 执行后行数变少,但列还在 → 很可能漏了
axis=1 - 删列却提示
KeyError: 'col_name'→ 实际是它在找索引名为'col_name'的行
实操建议:
- 删列必带
axis=1,养成肌肉记忆 - 不确定当前维度?先查
df.shape:(行数, 列数),删列后列数应减少
用 columns 索引直接 del 更快,但不能条件筛选
如果只是简单删一个已知列名的列,del df['col_name'] 比 drop 更轻量,不涉及拷贝、无参数歧义。
但它有硬限制:
- 一次只能删一列,不支持列表:
del df[['a','b']]语法错误 - 不能配合布尔条件(比如“删所有含 '_tmp' 的列”),得回退到
drop+ 列表推导 - 不返回任何值,也不支持
inplace参数——它本来就是原地删
示例:删掉临时列 'flag_temp',用 del 最干净:del df['flag_temp']
inplace 忘加、axis 漏写、或多列传参格式不对——这三处没 warning,只默默做错事。

















