当前位置:首页 > Python > 正文

Pandas遍历DataFrame的7种高效方法 | 数据分析教程

Pandas遍历DataFrame的7种高效方法

全面指南:从基础到高级技巧,提升你的数据分析效率

为什么需要高效的DataFrame遍历方法?

在数据分析中,DataFrame遍历是常见操作。选择合适的方法可以:

  • 提升10-100倍的性能
  • 减少内存消耗
  • 使代码更简洁易读
  • 避免常见的迭代陷阱
  • 处理大规模数据集
  • 提高开发效率

7种遍历方法详解

1. iterrows() - 逐行迭代

最常用的遍历方法,返回每行的索引和Series对象。

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})

for index, row in df.iterrows():
    print(f"Index: {index}, A: {row['A']}, B: {row['B']}")
优点: 简单直观,支持索引访问
缺点: 性能较差,不适用于大型数据集
适用场景: 小型数据集,简单操作

2. itertuples() - 高性能行迭代

以命名元组形式返回行数据,性能优于iterrows()。

for row in df.itertuples():
    print(f"Index: {row.Index}, A: {row.A}, B: {row.B}")
优点: 比iterrows()快得多,内存效率高
缺点: 不能直接修改DataFrame
适用场景: 大型数据集,只读操作

3. apply() - 逐行/列应用函数

沿DataFrame的轴应用函数,支持行或列操作。

# 逐行应用
df['sum'] = df.apply(lambda row: row['A'] + row['B'], axis=1)

# 逐列应用
df.apply(lambda col: col.max(), axis=0)
优点: 代码简洁,内部优化
缺点: 复杂逻辑可能降低可读性
适用场景: 中等规模数据,向量化操作

4. 向量化操作 - 最佳性能方案

利用pandas内置的向量化函数,避免显式循环。

# 替代循环的向量化操作
df['product'] = df['A'] * df['B']

# 使用NumPy函数
import numpy as np
df['log_A'] = np.log(df['A'])
优点: 性能最佳,简洁高效
缺点: 不适用于复杂行间逻辑
适用场景: 任何规模数据,首选方案

5. items()/iteritems() - 列迭代

按列迭代,返回列名和列内容。

for column_name, column_data in df.items():
    print(f"Column: {column_name}")
    print(column_data.values)
优点: 访问整列数据
缺点: 不适合逐行操作
适用场景: 按列处理数据

6. 索引直接访问 - 特定行/列

使用loc/iloc直接访问特定行或列。

# 访问特定行
row_1 = df.loc[1]

# 访问特定单元格
value = df.at[1, 'A']
优点: 灵活精确的访问控制
缺点: 不适合完整遍历
适用场景: 访问特定数据点

7. 使用Numba加速 - 超大型数据集

对于超大型数据集,使用Numba加速循环。

from numba import jit

@jit(nopython=True)
def custom_calculation(a, b):
    # 复杂计算逻辑
    return result

# 应用加速函数
results = [custom_calculation(a, b) for a, b in zip(df['A'], df['B'])]
优点: 处理超大型数据集性能极佳
缺点: 增加额外依赖,配置复杂
适用场景: 千万行以上数据集

性能对比

方法 10,000行耗时 100,000行耗时 内存使用 推荐指数
向量化操作 ~1ms ~5ms 最低 ★★★★★
itertuples() ~100ms ~1s ★★★★
apply() ~50ms ~500ms ★★★★
iterrows() ~500ms ~5s ★★

测试环境: Python 3.9, pandas 1.3, 8GB RAM

最佳实践建议

优先选择向量化操作

在大多数情况下,向量化操作是最佳选择。利用pandas和NumPy的内置函数可以显著提高性能。

避免逐行修改DataFrame

在循环中逐行修改DataFrame效率极低。应收集结果后一次性赋值或使用assign()方法。

使用适当的数据类型

优化数据类型(如使用category分类、int32代替int64)可以提升遍历性能。

掌握这些DataFrame遍历技巧,将使你的数据分析代码更高效、更专业!

发表评论