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/pandas-dataframe-row-iteration-methods-analysis/
作者
ww
发布于
2025年4月21日
许可协议