在我们日常的数据分析工作中,Python 之所以能够屹立不倒,很大程度上归功于其强大的生态系统,而 Pandas 无疑是这皇冠上最璀璨的明珠之一。它让数据的导入、清洗、分析和变换变得异常简单。
在之前的文章中,我们讨论过如何处理单个数据列。然而,现实世界的数据集往往非常复杂。你可能遇到过这样的场景:一个 Excel 表格包含了几十列数据,但你的分析任务只需要其中的“销售日期”、“产品类别”和“销售额”这三列。这时候,掌握如何高效地选择多个列就显得尤为重要了。这不仅能让我们专注于相关的数据,还能显著提升代码的可读性和运行效率。
在本文中,我们将深入探讨在 Pandas DataFrame 中选择多列的各种方法。我们将从最基础的语法开始,逐步过渡到高级的索引技巧,并分享一些在实际项目中积累的性能优化经验。同时,我们还会结合 2026 年最新的 AI 辅助开发趋势,向你展示如何利用 Cursor 或 Copilot 等 IDE 工具来加速这些看似繁琐的数据操作。
目录
准备工作:数据准备
在开始之前,让我们先创建一个示例 DataFrame,以便在后续的演示中保持一致。假设我们有一份包含员工信息的数据,包括姓名、年龄、地址和学历。
# 导入 pandas 库
import pandas as pd
import numpy as np # 引入 numpy 用于后续更复杂的数据生成
# 设置随机种子以保证结果可复现,这在数据科学实验中至关重要
np.random.seed(42)
# 定义包含员工数据的字典
data = {
‘Name‘: [‘Jai‘, ‘Princi‘, ‘Gaurav‘, ‘Anuj‘],
‘Age‘: [27, 24, 22, 32],
‘Address‘: [‘Delhi‘, ‘Kanpur‘, ‘Allahabad‘, ‘Kannauj‘],
‘Qualification‘: [‘Msc‘, ‘MA‘, ‘MCA‘, ‘Phd‘],
‘Salary‘: [50000, 60000, 45000, 70000], # 增加一列数据以便后续演示
‘Department‘: [‘HR‘, ‘Finance‘, ‘IT‘, ‘Sales‘] # 新增部门列
}
# 将字典转换为 DataFrame
df = pd.DataFrame(data)
# 查看完整数据
print("原始 DataFrame:")
print(df)
方法一:基础索引法(直接传参)
这是最直观、最常用的一种方法。当你知道确切的列名,并且想要选择特定的几列时,直接将列名列表传递给 DataFrame 是最快捷的方式。
1. 选择指定的几列
在这个例子中,我们只想查看员工的姓名和学历。我们可以通过传递一个包含列名的列表来实现。
# 选择 ‘Name‘ 和 ‘Qualification‘ 列
# 注意:这里需要使用双层方括号,因为外层是索引操作,内层是列名列表
result = df[[‘Name‘, ‘Qualification‘]]
print("
选择姓名和学历列:")
print(result)
工作原理: 当我们传递一个列表 INLINECODE9de7e6aa 给 INLINECODE2c0af89b 时,Pandas 会返回一个新的 DataFrame,其中只包含列表中指定的列。这非常适合用于数据清洗的初期阶段,例如丢弃不相关的列。
实用见解: 在处理成百上千列的数据集时,我们通常会先手动列出需要的关键列,以此将数据瘦身。这样可以减少内存占用,并让后续的数据处理代码更加清晰。在 2026 年的今天,如果你使用 Cursor 这样的 IDE,你甚至不需要手动敲出这些列名,你只需要输入 select_cols,AI 就会根据上下文自动帮你补全列名列表。
2. 使用 .columns 和切片
除了直接指定列名,我们还可以利用列的位置索引来选择连续的列。这在列名很长或者没有特定规律,但位置相邻时非常有用。
假设我们要选择第 2 列到第 4 列(Age, Address, Qualification)。注意,Python 的切片是左闭右开的,[1:4] 实际上包含索引 1, 2, 3。
# 使用 .columns 属性结合切片,选择第2列到第4列
# df.columns[1:4] 会生成一个索引对象,包含 ‘Age‘ 到 ‘Qualification‘
result = df[df.columns[1:4]]
print("
选择第2列到第4列(基于位置):")
print(result)
这种方法利用了 DataFrame 的底层索引机制,虽然不如直接列名直观,但在编写自动化脚本(例如处理格式固定但列名可能变化的日报表)时非常有效。
方法二:使用 loc[] 进行基于标签的索引
loc[] 是 Pandas 中最强大的索引器之一,它允许我们通过标签(即列名和行索引)来选择数据。它最大的优势在于支持切片操作,且切片的末端是包含的(inclusive),这与 Python 标准的切片行为不同。
1. 选择特定的行和列
我们可以结合行标签和列标签来精确提取数据。例如,我们只想看索引为 1 到 3 的行,且只显示 ‘Name‘ 和 ‘Qualification‘。
# 使用 loc[] 选择行 1:3 和指定的列
# 注意:loc 的切片是包含结束位置的,即 1, 2, 3 都会选中
result = df.loc[1:3, [‘Name‘, ‘Qualification‘]]
print("
使用 loc 选择特定行和列:")
print(result)
2. 选择从一个列到另一个列
这是 INLINECODEa79ba92d 最优雅的特性之一。如果我们想获取从 ‘Name‘ 到 ‘Address‘ 之间的所有列(按 DataFrame 定义的顺序),我们不需要列出所有列名,只需使用冒号 INLINECODE765ca37c。
# 选择前两行,以及从 ‘Name‘ 到 ‘Address‘ 之间的所有列
# 这意味着将选中 ‘Name‘, ‘Age‘, ‘Address‘
result = df.loc[0:1, ‘Name‘:‘Address‘]
print("
使用 loc 进行列范围选择:")
print(result)
最佳实践: 当你需要提取一个连续的列块时,loc 比手动列名列表更易维护。如果以后 DataFrame 中插入了一个新列,只要它在范围内,代码依然能正确运行。
方法三:使用 iloc[] 进行基于位置的索引
与 INLINECODE03c16987 相对,INLINECODE4c072ae7 是基于整数位置进行索引的。这在处理没有列名,或者列名非常冗长(比如某些从数据库导出的带前缀的字段)时非常方便。iloc 的切片遵循 Python 标准规则(左闭右开)。
让我们通过位置选择前 3 行和前 3 列(即索引 0, 1, 2)。
# 使用 iloc 基于位置选择数据
# 0:3 表示行 0, 1, 2
# 0:3 表示列 0, 1, 2
result = df.iloc[0:3, 0:3]
print("
使用 iloc 基于位置选择数据:")
print(result)
这种方法类似于我们在处理 NumPy 数组时的操作,非常适合算法开发者或者需要忽略列名语义、纯粹操作矩阵的场景。
方法四:高级技巧与实战应用
除了上述基础方法,在实际工程中,我们还可以结合一些逻辑运算来动态选择列。随着数据集规模的扩大,手动管理列名变得越来越困难,这时候动态筛选就显得尤为重要。
1. 过滤特定类型的列
在实际数据处理中,我们可能只想选择所有数值类型的列来进行统计分析,或者只选文本类型的列。我们可以使用 select_dtypes。
# 仅选择数值类型的列(如 Age 和 Salary)
# 这一步在做探索性数据分析(EDA)时非常关键,可以快速排除非数值列的干扰
result = df.select_dtypes(include=[‘int64‘, ‘float64‘])
print("
仅选择数值类型的列:")
print(result.head())
2. 使用 filter 方法进行模糊匹配
这是一个非常实用的技巧,常用于处理具有相似前缀的列。比如在处理带有时间序列特征的数据集时,列名可能是 ‘2020-01‘, ‘2020-02‘ 等。或者在我们的例子中,选择所有以 ‘A‘ 开头的列。
# 假设我们想选择所有以 ‘A‘ 开头的列
result = df.filter(like=‘A‘)
print("
选择列名包含 ‘A‘ 的列:")
print(result.head())
2026 技术视野:生产级性能优化与可观测性
在我们深入讨论了基础选择方法后,让我们把视角转向 2026 年的企业级开发环境。在当今的大数据背景下,代码的运行效率和可维护性要求比以往任何时候都要高。单纯的“能跑通”已经不足以满足需求,我们还需要关注代码的“性能画像”。
性能优化策略与监控
在选择列时,不同的方法在性能上有细微的差别,但在处理百万级数据时,这些差别会被放大。
性能对比:
通常情况下,直接传递列表 INLINECODEec1cbe03 是最快的,因为它是 Pandas 内部高度优化的路径。而 INLINECODE453a1c4e 和 INLINECODEcd1962de 虽然灵活,但在处理极大规模数据且不需要行过滤时,会有微小的开销。INLINECODE966c60e9 方法通常最慢,因为它涉及字符串匹配操作。
import time # 引入 time 模块进行简单的性能测试
# 模拟一个较大的 DataFrame
df_large = pd.DataFrame(np.random.randint(0, 100, size=(100000, 50)), columns=[f‘col_{i}‘ for i in range(50)])
# 测试直接索引法的性能
start_time = time.time()
for _ in range(1000):
_ = df_large[[‘col_1‘, ‘col_2‘, ‘col_3‘]]
print(f"直接索引耗时: {time.time() - start_time:.4f} 秒")
# 测试 filter 方法的性能
start_time = time.time()
for _ in range(1000):
_ = df_large.filter(like=‘col_‘)
print(f"Filter 耗时: {time.time() - start_time:.4f} 秒")
现代监控实践:
在我们最近的一个金融科技项目中,我们不仅关注代码逻辑,还集成了可观测性工具。我们可以使用类似于 memory_profiler 的工具来监控列选择操作的内存占用。
# 安装: pip install memory_profiler
from memory_profiler import profile
@profile
def process_large_data():
# 模拟加载数据
df_temp = pd.DataFrame(np.random.randn(100000, 20))
# 仅选择需要的列,释放不再需要的内存
df_reduced = df_temp[[0, 1, 2, 3, 4]]
return df_reduced
# 实际运行中,你会在终端看到内存消耗的详细报告
# process_large_data()
通过这种方式,我们可以确保数据管道不会因为内存泄漏或低效的索引操作而导致 OOM(内存溢出)错误。
边界情况与容灾处理
在生产环境中,数据往往是脏乱的。你可能尝试选择一个不存在的列,这会直接导致程序崩溃。为了避免这种情况,我们推荐使用“安全索引”模式。
def safe_select_columns(df, columns):
"""
安全地选择列,如果列不存在则跳过或填充 NaN。
这在我们的数据管道中是一个标准工具函数。
"""
existing_cols = [col for col in columns if col in df.columns]
missing_cols = set(columns) - set(existing_cols)
if missing_cols:
print(f"警告: 以下列不存在并已跳过: {missing_cols}")
return df[existing_cols]
# 测试容灾:尝试选择一个不存在的列 ‘Email‘
result = safe_select_columns(df, [‘Name‘, ‘Email‘, ‘Age‘])
print("
容灾测试结果:")
print(result)
这种防御性编程的思想在处理自动化报表时至关重要,它能保证即使在源数据结构发生变化(比如缺少某些字段)时,下游任务依然能够运行。
AI 辅助开发:从 Cursor 到 Agentic Workflow
最后,让我们聊聊 2026 年的开发体验。现在的数据分析工程师不再只是单纯的代码编写者,更是“模型训练师”和“AI 协调员”。
Vibe Coding(氛围编程)实践:
当我们需要编写一个复杂的列选择逻辑时,比如“选择所有列名包含‘Q1’且数据类型为浮点数的列”,我们不再需要去查阅 Pandas 官方文档。我们可以在 Cursor 或 Windsurf 这样的 AI IDE 中直接写下注释:
# [AI] 使用 filter 和 select_dtypes 找到所有包含 Q1 的浮点数列
# 并且计算这些列的平均值,如果为空则填充为 0
AI 会自动生成以下代码:
# AI 生成的代码片段示例
q1_float_cols = df.filter(like=‘Q1‘).select_dtypes(include=[‘float64‘, ‘float32‘]).columns.tolist()
# 检查是否有符合条件的列
if q1_float_cols:
# 选择这些列并计算平均值
# 利用 .mean() 跳过 NaN 值
avg_values = df[q1_float_cols].mean()
print("Q1 浮点数列的平均值:")
print(avg_values)
else:
print("未找到符合条件的列。")
多模态调试体验:
假设你遇到了 KeyError,现在你可以直接截图报错信息扔给 IDE 里的 Chat pane,AI 会结合你的上下文(当前 DataFrame 的结构)来分析原因,甚至直接给出修复后的代码块。这种AI原生的开发流极大地降低了 Pandas 的学习曲线,让我们能更专注于业务逻辑本身,而不是语法细节。
总结
在这篇文章中,我们一起探索了在 Pandas DataFrame 中选择多列的多种方式。我们学习了最基础的下标索引,也深入了解了 INLINECODEc61ab820 和 INLINECODEc6070e26 这两大索引利器的区别与联系,最后还看了一些高级的过滤技巧。
更重要的是,我们将这些基础知识放在了 2026 年的技术背景下进行了审视。从性能监控到容灾处理,再到 AI 辅助编程,掌握这些技能将让你在处理数据时更加游刃有余。
你可以根据具体的业务场景选择最合适的方法:
- 明确知道列名时:使用
df[[‘Name‘, ‘Age‘]]。 - 需要切片或混合行列选择时:使用 INLINECODE7f3d67f6(标签)或 INLINECODE6817c2a3(位置)。
- 需要按模式筛选列时:使用 INLINECODEa07ae984 或 INLINECODE8d8fff31。
- 生产环境部署时:务必考虑异常处理和内存优化。
希望这些技巧能帮助你在数据科学的道路上走得更快、更稳。快去你的项目中试试这些方法,或者让你的 AI 帮你写一个自动化脚本吧!