在Python数据分析中,Pandas的DataFrame是最常用的数据结构之一。当我们需要逐行处理数据时,如何高效遍历DataFrame的行就成了一个关键问题。5种主流的遍历方法,并通过性能对比和实际示例帮助你选择最适合业务场景的方案。
1. 使用iterrows()方法
iterrows()
是Pandas内置的行遍历方法,会返回一个生成器,每次迭代包含行索引和行数据的Series对象:
import pandas as pd
df = pd.DataFrame({'A': [1,2], 'B': [3,4]})
for index, row in df.iterrows():
print(f"Index: {index}, A: {row['A']}, B: {row['B']}")
特点:
- 保留行索引信息
- 返回的Series对象会复制数据,内存开销较大
- 适合需要索引的小型数据集
2. 高效的itertuples()方法
itertuples()
以命名元组形式返回行数据,性能明显优于iterrows():
for row in df.itertuples():
print(f"Index: {row.Index}, A: {row.A}, B: {row.B}") # 注意属性访问方式
优势:
- 比iterrows()快3-5倍
- 内存占用更低
- 不支持列名包含空格等特殊字符
3. 向量化操作优先原则
在大多数情况下,应尽量避免显式循环,改用Pandas内置的向量化操作:
# 替代遍历的方案
df['C'] = df['A'] + df['B'] # 直接列运算
df.apply(lambda x: x['A']*2, axis=1) # 按行apply
适用场景:
- 数学运算
- 条件判断
- 类型转换等批量操作
4. 使用items()进行列优先遍历
当需要列向操作时,可以结合items()和行遍历:
for col_name, col_data in df.items():
for cell in col_data: # 遍历该列所有值
print(cell)
典型用例:
- 列级别的统计分析
- 特定列的特殊处理
5. 极大数据集的优化方案
处理百万行以上数据时,可以考虑:
- 分块处理:使用
chunksize
参数
for chunk in pd.read_csv('large.csv', chunksize=10000):
process(chunk)
- 并行计算:配合Dask或Modin库
- 类型优化:提前转换dtype减少内存占用
性能对比
通过测试10万行DataFrame的遍历时间:
- 向量化操作:<10ms
- itertuples():约200ms
- iterrows():约800ms
- 普通for循环:>1s
建议优先选择向量化方法,必须遍历时使用itertuples()。实际项目中,建议先用少量数据测试不同方法的性能表现。
(本文地址:https://www.nzw6.com/14294.html)