Python DataFrame 删除全攻略:del、drop() 与 dropna() 的终极选择
从入门到精通,一篇搞懂Pandas中删除列、行及缺失数据的所有方法,告别代码报错,提升数据处理效率!
在使用Python进行数据分析时,Pandas DataFrame的删除操作是家常便饭,本文将深度解析del、drop()和dropna()这三大核心删除方法,通过详尽的代码示例和场景对比,助你精准选择最合适的工具,轻松驾驭你的数据表。

引言:为什么“删除”是数据分析的关键一环?
作为一名数据分析师或程序员,我们每天处理的大量数据往往并非完美无瑕,无关的列、重复的行、残缺的值……这些“数据噪音”不仅会占用宝贵的内存,更会严重干扰后续的分析和建模,导致“垃圾进,垃圾出”(Garbage In, Garbage Out)的糟糕结果。
高效、准确地删除数据是数据清洗过程中至关重要的一步,在Pandas库中,del、drop()和dropna()是执行删除任务的三大主力,它们看似功能相似,实则各有千秋,用错地方不仅效率低下,还可能引发难以察觉的bug。
我们就来彻底搞懂这三者的区别与用法,让你在面对各种删除需求时,都能游刃有余。
第一部分:最直接、最暴力的“利刃”——del
del是Python内置的关键字,在Pandas DataFrame中,它主要用于删除指定的列,你可以把它想象成一把锋利的手术刀,目标明确,动作迅速。

核心特点:
- 操作对象: 只能用于删除列。
- 原地修改: 直接在原始的DataFrame上进行修改,不返回新的DataFrame。
- 不可逆: 执行后,该列数据将永久消失,除非你之前有备份。
代码实战:
假设我们有一个学生成绩表:
import pandas as pd
import numpy as np
# 创建一个示例DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'语文': [90, 85, 92, 88],
'数学': [95, 88, np.nan, 76], # 注意有一个缺失值
'英语': [88, 92, 85, 90]
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)
目标: 删除“英语”这一列。
# 使用 del 删除 '英语' 列
del df['英语']
print("\n使用 del 删除 '英语' 列后的DataFrame:")
print(df)
输出结果:
原始DataFrame:
姓名 语文 数学 英语
0 张三 90 95.0 88
1 李四 85 88.0 92
2 王五 92 NaN 85
3 赵六 88 76.0 90
使用 del 删除 '英语' 列后的DataFrame:
姓名 语文 数学
0 张三 90 95.0
1 李四 85 88.0
2 王五 92 NaN
3 赵六 88 76.0
⚠️ 重要提醒:del 的“陷阱”
新手最常犯的错误就是尝试用del来删除行:

# 错误示范!这会引发 TypeError # del df[0]
运行上述代码会报错:TypeError: cannot delete index key from a DataFrame。del是列的专属工具。
第二部分:最灵活、最强大的“瑞士军刀”——drop()
如果说del是专用的手术刀,那drop()就是一把功能全面的瑞士军刀,它是Pandas中最通用、最推荐的删除方法,既可以删除列,也可以删除行。
核心特点:
- 操作对象: 可删除行或列。
- 默认非原地修改: 默认返回一个新的DataFrame,原始DataFrame保持不变(
inplace=False),这是它的一大优点,提供了安全性。 - 功能丰富: 可以通过
axis参数指定删除方向,通过labels指定标签,通过inplace参数决定是否原地修改。
代码实战:
我们继续使用上面的df。
场景1:删除行
目标: 删除索引为2的行(即王五的数据)。
# 删除索引为 2 的行,默认 axis=0
df_dropped_row = df.drop(labels=2)
print("\n使用 drop() 删除索引为 2 的行:")
print(df_dropped_row)
print("\n原始DataFrame是否改变:", df is df_dropped_row) # 输出 False,证明未改变
场景2:删除列
目标: 删除“数学”这一列。
# 删除 '数学' 列,需要指定 axis=1
df_dropped_col = df.drop(labels='数学', axis=1)
print("\n使用 drop() 删除 '数学' 列:")
print(df_dropped_col)
场景3:原地删除
如果你确定要修改原始DataFrame,可以使用inplace=True。
# 原地删除 '语文' 列
df.drop(labels='语文', axis=1, inplace=True)
print("\n使用 drop() 原地删除 '语文' 列后的DataFrame:")
print(df)
del vs drop():我该用谁?
- 当你只需要快速、明确地删除一列,且不关心原始DataFrame是否被修改时,用
del,它更直接,代码更简洁。 - 当你需要删除行,或者希望保留原始数据以防万一,或者需要进行复杂的标签删除时,强烈推荐使用
drop(),它的安全性和灵活性是del无法比拟的。
第三部分:处理“脏数据”的“清道夫”——dropna()
在真实世界的数据中,缺失值(NaN, None等)是不可避免的。dropna()方法专门用于处理这些“坏数据”,它的目标是删除包含缺失值的行或列。
核心特点:
- 操作对象: 针对的是缺失值。
- 灵活性高: 可以精确控制删除的规则(行、列,或两者)。
- 非原地修改: 默认返回一个新的DataFrame。
代码实战:
我们回到最初包含缺失值的DataFrame:
# 重新创建带有缺失值的DataFrame
data_with_na = {
'姓名': ['张三', '李四', '王五', '赵六'],
'语文': [90, 85, 92, 88],
'数学': [95, 88, np.nan, 76],
'英语': [88, 92, np.nan, 90]
}
df_na = pd.DataFrame(data_with_na)
print("包含缺失值的DataFrame:")
print(df_na)
默认行为:删除所有包含缺失值的行
# 默认删除任何包含 NaN 的行
df_dropped_na_rows = df_na.dropna()
print("\n使用 dropna() 删除所有含 NaN 的行:")
print(df_dropped_na_rows)
输出结果中,王五的行(数学和英语为NaN)和李四的行(数学为NaN)都被删除了。
进阶用法:删除包含缺失值的列
# 删除任何包含 NaN 的列
df_dropped_na_cols = df_na.dropna(axis=1)
print("\n使用 dropna(axis=1) 删除所有含 NaN 的列:")
print(df_dropped_na_cols)
输出结果中,“数学”和“英语”列都被删除了。
精确控制:how和thresh参数
how='all':只有当一行/列中的所有值都为缺失值时才删除。thresh=n:保留至少有n个非缺失值的行/列。
# 只有当一行的所有值都为 NaN 时才删除 (本例中没有这样的行)
df_drop_all_na = df_na.dropna(how='all')
print("\n使用 how='all' 的结果:")
print(df_drop_all_na)
# 保留至少有 3 个非 NaN 值的行
df_thresh = df_na.dropna(thresh=3)
print("\n使用 thresh=3 的结果 (只删除 