杰瑞科技汇

Python dataframe del如何高效删除列?

Python DataFrame 删除全攻略:deldrop()dropna() 的终极选择

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

Python dataframe del如何高效删除列?-图1
(图片来源网络,侵删)

引言:为什么“删除”是数据分析的关键一环?

作为一名数据分析师或程序员,我们每天处理的大量数据往往并非完美无瑕,无关的列、重复的行、残缺的值……这些“数据噪音”不仅会占用宝贵的内存,更会严重干扰后续的分析和建模,导致“垃圾进,垃圾出”(Garbage In, Garbage Out)的糟糕结果。

高效、准确地删除数据是数据清洗过程中至关重要的一步,在Pandas库中,deldrop()dropna()是执行删除任务的三大主力,它们看似功能相似,实则各有千秋,用错地方不仅效率低下,还可能引发难以察觉的bug。

我们就来彻底搞懂这三者的区别与用法,让你在面对各种删除需求时,都能游刃有余。

第一部分:最直接、最暴力的“利刃”——del

del是Python内置的关键字,在Pandas DataFrame中,它主要用于删除指定的列,你可以把它想象成一把锋利的手术刀,目标明确,动作迅速。

Python dataframe del如何高效删除列?-图2
(图片来源网络,侵删)

核心特点:

  1. 操作对象: 只能用于删除
  2. 原地修改: 直接在原始的DataFrame上进行修改,不返回新的DataFrame
  3. 不可逆: 执行后,该列数据将永久消失,除非你之前有备份。

代码实战:

假设我们有一个学生成绩表:

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来删除行:

Python dataframe del如何高效删除列?-图3
(图片来源网络,侵删)
# 错误示范!这会引发 TypeError
# del df[0] 

运行上述代码会报错:TypeError: cannot delete index key from a DataFramedel是列的专属工具。


第二部分:最灵活、最强大的“瑞士军刀”——drop()

如果说del是专用的手术刀,那drop()就是一把功能全面的瑞士军刀,它是Pandas中最通用、最推荐的删除方法,既可以删除列,也可以删除行。

核心特点:

  1. 操作对象: 可删除
  2. 默认非原地修改: 默认返回一个新的DataFrame,原始DataFrame保持不变(inplace=False),这是它的一大优点,提供了安全性。
  3. 功能丰富: 可以通过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()方法专门用于处理这些“坏数据”,它的目标是删除包含缺失值的行或列

核心特点:

  1. 操作对象: 针对的是缺失值
  2. 灵活性高: 可以精确控制删除的规则(行、列,或两者)。
  3. 非原地修改: 默认返回一个新的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)

输出结果中,“数学”和“英语”列都被删除了。

精确控制:howthresh参数

  • 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 的结果 (只删除
分享:
扫描分享到社交APP
上一篇
下一篇