Pandas遍历DataFrame每一行的多种方法
作者:袁袁袁袁满
Pandas遍历DataFrame有多种方法:iterrows(返回Series,适合需索引)、itertuples(命名元组,高性能)、apply(向量化计算)、df.values(最快但无列名),最佳实践是优先使用向量化操作,避免逐行遍历,大数据推荐dask或swifter加速,下面由小编给大家详细说说
在 Pandas 中,遍历 DataFrame 的每一行有多种方法,每种方法适用于不同的场景。以下是常见的几种方式及其适用场景:
1. iterrows() - 返回索引和行数据(Series)
import pandas as pd df = pd.DataFrame({'A': [1, 2, 3], 'B': ['x', 'y', 'z']}) for index, row in df.iterrows(): print(f"索引: {index}, A列值: {row['A']}, B列值: {row['B']}")
特点:
- 返回
(index, Series)
对,row
是 Pandas Series 对象。 - 缺点:性能较差(因为
row
是 Series,不是原生 Python 类型)。 - 适用场景:需要访问行索引和少量数据时。
2. itertuples() - 返回命名元组(更快)
for row in df.itertuples(): print(f"索引: {row.Index}, A列值: {row.A}, B列值: {row.B}")
特点:
- 返回
namedtuple
,访问列名更方便(如row.A
而不是row['A']
)。 - 优点:比
iterrows()
快很多(因为直接操作元组)。 - 适用场景:需要高性能遍历,且不需要修改数据。
3. apply() - 对每行应用函数(推荐)
def process_row(row): return f"A={row['A']}, B={row['B']}" df.apply(process_row, axis=1) # axis=1 表示按行应用
特点:
- 使用向量化操作,比
iterrows()
/itertuples()
更快。 - 适用场景:需要对每行进行计算并返回新数据。
4. items() - 遍历列(而非行)
for col_name, col_data in df.items(): print(f"列名: {col_name}") print(f"列数据:\n{col_data}")
特点:
- 遍历的是 列 而不是行。
- 适用场景:需要按列处理数据时。
5. 直接转换为 NumPy 数组(最快)
for row in df.values: # 或 df.to_numpy() print(f"A={row[0]}, B={row[1]}") # 按列索引访问
特点:
- 直接操作 NumPy 数组,速度最快。
- 缺点:丢失列名,只能按索引访问。
- 适用场景:需要极致性能,且不需要列名。
6. 使用 loc 或 iloc 访问特定行
for i in range(len(df)): print(df.loc[i, 'A']) # 按标签访问 print(df.iloc[i, 0]) # 按位置访问
特点:
- 适用于随机访问特定行。
- 缺点:性能较差(每次调用
loc
/iloc
都有开销)。
性能对比
方法 | 速度 | 适用场景 |
---|---|---|
itertuples() | ⭐⭐⭐⭐ | 高性能遍历 |
apply() | ⭐⭐⭐ | 向量化操作 |
iterrows() | ⭐ | 需要索引时 |
df.values | ⭐⭐⭐⭐⭐ | 极致性能(无列名) |
loc / iloc | ⭐ | 随机访问 |
最佳实践
- 尽量避免逐行遍历,优先使用 Pandas 的向量化操作(如
df['A'] * 2
)。 - 如果必须遍历:
- 需要列名 →
itertuples()
- 需要极致性能 →
df.values
或to_numpy()
- 需要修改数据 →
iterrows()
或apply()
- 需要列名 →
- 大数据处理:考虑
dask
或swifter
加速。
示例:修改 DataFrame 的某一列
# 方法1:使用 iterrows()(不推荐,慢) for index, row in df.iterrows(): df.loc[index, 'B'] = row['B'] + '_modified' # 方法2:使用 apply()(推荐) df['B'] = df['B'].apply(lambda x: x + '_modified') # 方法3:向量化操作(最快) df['B'] = df['B'] + '_modified'
总结
需求 | 推荐方法 |
---|---|
高性能遍历 | itertuples() |
需要修改数据 | apply() 或 iterrows() |
极致性能 | df.values |
向量化计算 | 直接使用 Pandas/NumPy 操作 |
尽量避免逐行遍历,Pandas 的优势在于 向量化计算!
到此这篇关于Pandas遍历DataFrame每一行的多种方法的文章就介绍到这了,更多相关Pandas遍历DataFrame每一行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!