python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Pandas遍历DataFrame每一行

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']}")

特点

2. itertuples() - 返回命名元组(更快)

for row in df.itertuples():
    print(f"索引: {row.Index}, A列值: {row.A}, B列值: {row.B}")

特点

3. apply() - 对每行应用函数(推荐)

def process_row(row):
    return f"A={row['A']}, B={row['B']}"

df.apply(process_row, axis=1)  # axis=1 表示按行应用

特点

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]}")  # 按列索引访问

特点

6. 使用 loc 或 iloc 访问特定行

for i in range(len(df)):
    print(df.loc[i, 'A'])  # 按标签访问
    print(df.iloc[i, 0])   # 按位置访问

特点

性能对比

方法速度适用场景
itertuples()⭐⭐⭐⭐高性能遍历
apply()⭐⭐⭐向量化操作
iterrows()需要索引时
df.values⭐⭐⭐⭐⭐极致性能(无列名)
loc / iloc随机访问

最佳实践

  1. 尽量避免逐行遍历,优先使用 Pandas 的向量化操作(如 df['A'] * 2)。
  2. 如果必须遍历
    • 需要列名 → itertuples()
    • 需要极致性能 → df.valuesto_numpy()
    • 需要修改数据 → iterrows()apply()
  3. 大数据处理:考虑 daskswifter 加速。

示例:修改 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每一行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文