Pandas DataFrame 行迭代方法全解析

Pandas DataFrame 行迭代方法全解析

技术背景

在数据分析和处理中,Pandas 是 Python 里极为常用的库,而 DataFrame 作为其核心数据结构之一,常需要对其行进行迭代操作。不过,Pandas 官方文档提示,迭代操作通常速度较慢,很多情况下可借助向量化、Cython 例程等方法替代。但在某些特定场景,如执行依赖于每行数据的代码、处理小型数据集时,迭代仍有其用武之地。

实现步骤

1. 使用 iterrows() 方法

iterrows() 是一个生成器,它会同时返回行索引和行数据(以 Series 形式)。

1
2
3
4
5
6
7
import pandas as pd

df = pd.DataFrame({'c1': [10, 11, 12], 'c2': [100, 110, 120]})
df = df.reset_index() # 确保索引与行数匹配

for index, row in df.iterrows():
print(row['c1'], row['c2'])

2. 使用 itertuples() 方法

itertuples() 返回命名元组,通常比 iterrows() 速度更快,且能更好地保留数据类型。

1
2
for row in df.itertuples(index=True, name='Pandas'):
print(row.c1, row.c2)

3. 使用 apply() 方法

apply() 可将函数应用于 DataFrame 的每一行或每一列。

1
2
3
4
def valuation_formula(x, y):
return x * y * 0.5

df['price'] = df.apply(lambda row: valuation_formula(row['c1'], row['c2']), axis=1)

4. 使用列表推导式

列表推导式适用于没有向量化解决方案、性能要求不是极高且需对代码进行逐元素转换的场景。

1
2
3
4
5
# 迭代一列
result = [x * 2 for x in df['c1']]

# 迭代两列
result = [x + y for x, y in zip(df['c1'], df['c2'])]

5. 使用 iloc 方法

通过 iloc 按整数位置访问行。

1
2
for i in range(0, len(df)):
print(df.iloc[i]['c1'], df.iloc[i]['c2'])

核心代码

综合示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import pandas as pd
import numpy as np

# 创建 DataFrame
df = pd.DataFrame({'c1': [10, 11, 12], 'c2': [100, 110, 120]})

# 使用 iterrows()
print("使用 iterrows():")
for index, row in df.iterrows():
print(row['c1'], row['c2'])

# 使用 itertuples()
print("\n使用 itertuples():")
for row in df.itertuples(index=True, name='Pandas'):
print(row.c1, row.c2)

# 使用 apply()
print("\n使用 apply():")
def valuation_formula(x, y):
return x * y * 0.5

df['price'] = df.apply(lambda row: valuation_formula(row['c1'], row['c2']), axis=1)
print(df['price'])

# 使用列表推导式
print("\n使用列表推导式:")
result = [x * 2 for x in df['c1']]
print(result)

# 使用 iloc
print("\n使用 iloc:")
for i in range(0, len(df)):
print(df.iloc[i]['c1'], df.iloc[i]['c2'])

最佳实践

  • 优先使用向量化操作:多数基本操作和计算都可通过 Pandas 的向量化方法实现,这通常是最快的方式。
  • 使用列表推导式:当没有向量化解决方案且性能要求不是极高时,列表推导式是不错的选择。
  • 谨慎使用 iterrows()itertuples():仅在必要时使用,如生成行对象或命名元组进行顺序处理。
  • 使用 apply():当需要对每行应用自定义函数时,可考虑使用 apply(),但要注意其性能。

常见问题

1. iterrows() 速度慢

iterrows() 速度通常较慢,因为它会为每一行创建一个 Series 对象。如果对性能有要求,建议使用 itertuples() 或其他更高效的方法。

2. iterrows() 不保留数据类型

iterrows() 返回的 Series 可能不会保留每行的数据类型,若需保留数据类型,可使用 itertuples()

3. 避免在迭代时修改数据

在使用 iterrows()itertuples() 迭代时,不建议修改正在迭代的数据,因为这可能不会产生预期效果。若需修改数据,可使用 apply() 或其他方法。


Pandas DataFrame 行迭代方法全解析
https://119291.xyz/posts/2025-04-21.pandas-dataframe-row-iteration-methods-analysis/
作者
ww
发布于
2025年4月21日
许可协议