Pandas 删列大全:4 种高效方法与实战技巧

在数据清洗和分析的过程中,我们经常会遇到数据集过于臃肿的情况。很多时候,原始数据中包含了一些对我们分析毫无帮助的列,或者包含大量缺失值的冗余字段。如果不及时清理,这些“噪音”不仅会占用宝贵的内存资源,还会分散我们的注意力,降低分析效率。

作为一名数据开发者,我们非常熟悉 Pandas 强大的数据处理能力。在本文中,我们将深入探讨如何从 Pandas DataFrame 中高效地删除列。我们将从最基础的按名称删除开始,逐步介绍就地修改、Python 原生语句以及处理缺失值的高级技巧。这不仅是一份语法指南,更是一份实战中的最佳实践清单。

基础示例:构建我们的数据集

让我们先通过一个简单的 Python 字典构建一个 DataFrame,以便演示后续的各种操作。

import pandas as pd
import numpy as np

# 创建一个示例数据集
data = {
    ‘Name‘: [‘Alice‘, ‘Bob‘, ‘Charlie‘], 
    ‘Age‘: [25, 30, 35], 
    ‘City‘: [‘NY‘, ‘LA‘, ‘SF‘]
}
df = pd.DataFrame(data)

print("原始 DataFrame:")
print(df)

在处理任何数据之前,最好先通过 INLINECODE7e6c317c 或 INLINECODEf2063f61 查看数据的结构。现在,让我们进入正题,看看如何移除那些不需要的列。

方法 1:按名称精准删除列

这是最常用、最直观的方法。drop() 函数允许我们指定列的标签来移除它。这里有一个关键点需要注意:Pandas 的操作默认通常返回一个新的对象副本,而不是直接修改原数据(除非你指定了特定参数)。

A. 删除单列

假设我们决定不再需要 ‘City‘ 这一列。我们可以调用 drop() 方法,并指定列名。

参数说明:

  • labels:我们要删除的列名。
  • INLINECODE329a0ef0:这是关键参数。在 Pandas 中,INLINECODE61247f4b 代表行(索引),而 INLINECODE8eb3ad6e 代表列。一定要记住设置 INLINECODEc70df91b,否则 Pandas 会去索引行中寻找名为 ‘City‘ 的标签并报错。
# 删除 ‘City‘ 列,axis=1 表示操作的是列
df_dropped = df.drop(‘City‘, axis=1)

print("
删除 ‘City‘ 后的结果:")
print(df_dropped)

输出结果:

      Name  Age
0    Alice   25
1      Bob   30
2  Charlie   35

在这个例子中,INLINECODEfabe1855 是一个新的 DataFrame。如果你检查原始的 INLINECODE26f1565b,你会发现 ‘City‘ 列依然存在。这是为了保证数据操作的安全性和可追溯性。

B. 一次删除多列

在实际工作中,我们经常需要一次性清理多个字段。这时,我们可以向 drop() 传递一个列名列表

假设我们要同时删除 ‘Age‘ 和 ‘City‘:

# 同时删除 ‘Age‘ 和 ‘City‘ 列
cols_to_drop = [‘Age‘, ‘City‘]
df_multi_drop = df.drop(cols_to_drop, axis=1)

print("
同时删除 ‘Age‘ 和 ‘City‘ 后的结果:")
print(df_multi_drop)

输出结果:

      Name
0    Alice
1      Bob
2  Charlie

实用技巧:使用 columns 参数

虽然 INLINECODEee4296ee 是标准写法,但 Pandas 也提供了一个更可读的参数 INLINECODEc4f35afa。它的效果等同于 axis=1,但代码意图更加明确。

# 使用 columns 参数,代码可读性更强
df_clean = df.drop(columns=[‘Age‘, ‘City‘])

方法 2:原地修改 – 使用 inplace=True

在处理大型数据集时,内存管理是一个重要的考量。如果不需要保留原始数据,或者为了节省内存,我们可以使用 inplace=True 参数。这意味着操作将直接在原始 DataFrame 上进行,而不会返回一个新的对象。

使用场景

当数据量达到 GB 级别时,创建副本会消耗大量内存。此时,inplace=True 是最佳选择。

import pandas as pd

data = {‘A‘: [1, 2, 3], ‘B‘: [4, 5, 6], ‘C‘: [7, 8, 9]}
df = pd.DataFrame(data)

print("原始 DF:")
print(df)

# 就地删除 ‘B‘ 列
# 注意:该操作不返回任何值,直接修改 df
df.drop(‘B‘, axis=1, inplace=True)

print("
使用 inplace=True 删除 ‘B‘ 后的 DF:")
print(df)

输出结果:

   A  C
0  1  7
1  2  8
2  3  9

常见错误警告:

千万不要写成 INLINECODEf4ef08e0。因为 INLINECODEa1110b9f 时,函数返回的是 INLINECODEc1b35caa。这样写会导致你的 INLINECODE59da625b 变量被赋值为 None,从而丢失数据!

方法 3:使用 Python 原生 del 语句

除了 Pandas 提供的方法,我们还可以使用 Python 原生的 del 关键字。这是一种非常直接且底层的删除方式。

del 的特点

  • 就地操作:它总是修改原始 DataFrame,没有返回值。
  • 语法简洁del df[‘列名‘]
  • 局限性:它一次只能删除一列,不支持像 drop 那样传递列表来删除多列。
import pandas as pd

data = {‘A‘: [10, 20, 30], ‘B‘: [40, 50, 60], ‘C‘: [70, 80, 90]}
df = pd.DataFrame(data)

print("原始 DF:")
print(df)

# 使用 del 删除列 ‘C‘
del df[‘C‘]

print("
使用 del 删除 ‘C‘ 后的 DF:")
print(df)

输出结果:

    A   B
0  10  40
1  20  50
2  30  60

INLINECODEf8915d3c vs INLINECODE36cddaa8:选哪个?

  • 如果你需要删除多列,或者需要链式调用,请使用 drop()
  • 如果你在交互式环境中快速清理单个列,del 是个不错的选择。

方法 4:清理缺失数据 – 删除含 NaN 的列

真实世界的数据往往是脏数据。很多时候,我们需要根据数据完整性来删除列。例如,如果某一列缺失值超过了 50%,我们可能选择直接丢弃该列。这就是 dropna() 的用武之地。

A. 删除任何包含缺失值的列

默认情况下,只要列中有一个 NaN,该列就会被删除。

import pandas as pd
import numpy as np

data = {
    ‘A‘: [10, np.nan, 30], 
    ‘B‘: [np.nan, 50, 60], 
    ‘C‘: [70, 80, 90]
}
df = pd.DataFrame(data)

print("包含缺失值的 DF:")
print(df)

# 删除任何包含 NaN 的列
df_cleaned = df.dropna(axis=1)

print("
删除含 NaN 列后的结果 (仅剩 C 列):")
print(df_cleaned)

输出结果:

     C
0   70
1   80
2   90

B. 使用 thresh 参数进行高级过滤

这是很多人容易忽略的高级技巧。INLINECODEd5d27733 参数允许我们设置“非空值的最小数量”。例如,INLINECODE9ef37cd6 意味着:如果这一列至少有 2 个非空值,就保留它;否则删除。

data = {
    ‘A‘: [1, np.nan, np.nan],  # 只有1个非空值
    ‘B‘: [1, 2, np.nan],        # 有2个非空值
    ‘C‘: [1, 2, 3]              # 有3个非空值
}
df = pd.DataFrame(data)

# 设置阈值:至少需要 2 个非空值才能保留该列
# A 列会被删除(只有1个有效值)
# B 和 C 列会被保留
df_thresh = df.dropna(axis=1, thresh=2)

print(df_thresh)

这个功能在数据清洗中极其强大,能防止我们误删那些只偶尔缺失数据的列。

深入探讨:常见错误与最佳实践

在与 Pandas 斗争的过程中,我们总结了一些经验教训,希望能帮助你避开坑。

1. KeyError: 找不到列名

错误原因:当你尝试删除一个不存在的列时,Pandas 默认会抛出 KeyError。
解决方案:使用 errors=‘ignore‘ 参数。

# 如果列不存在,忽略错误而不是报错崩溃
df.drop(‘NonExistentCol‘, axis=1, errors=‘ignore‘)

这在编写通用数据处理脚本时非常有用,能保证程序的健壮性。

2. 忽略了 View 与 Copy 的区别

虽然 INLINECODEda77c9c9 看起来很方便,但在链式操作中,我们更倾向于使用非 INLINECODE57acbc9c 的方式。

# 推荐的链式风格
df = df.drop(‘A‘, axis=1).dropna(axis=1)

这样代码更清晰,更容易调试。

3. 性能优化建议

如果你是在一个循环中逐行处理数据并试图删除列,请立刻停止

  • 不要在循环中反复调用 drop。Pandas 的每次操作都会产生内存开销。
  • 应该:先收集好所有要删除的列名列表,然后在循环结束后一次性调用 drop(columns=list)。这将带来巨大的性能提升。

总结

在这篇文章中,我们不仅掌握了四种删除 Pandas 列的核心方法——按名称删除、就地修改、使用 INLINECODEf1e7013d 语句以及处理缺失值——还深入探讨了 INLINECODE4b2fbd49 参数、错误处理以及性能优化策略。

清理数据是数据科学工作中最枯燥但也最关键的一步。熟练运用 drop() 及其相关参数,能让你在处理杂乱数据集时游刃有余。

后续步骤

如果你想进一步提升技能,我们建议你尝试以下操作:

  • 尝试使用 df.filter() 来筛选出你想要的列,而不是删除不想要的(有时候反向思考更高效)。
  • 探索如何基于数据类型(如 df.select_dtypes)来批量删除特定类型的列。
  • 在你的下一个项目中,尝试应用 thresh 参数来自动化清洗过程。

希望这些技巧能帮助你编写出更高效、更优雅的 Python 数据分析代码!祝你编码愉快!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/43902.html
点赞
0.00 平均评分 (0% 分数) - 0