pandas DataFrame for循环迭代指南:核心方法与避坑详解

顾言
顾言
发布时间:2026-10-12| 2人浏览过
原创

在Python数据分析中,频繁需要遍历pandas.DataFrame提取或处理数据。本文系统讲解for循环迭代DataFrame的正确姿势,涵盖逐行、逐列、指定列取值方法,剖析iterrows与itertuples的返回特性及性能差异,并明确指出迭代修改变量不生效的原理,最后给出基于向量化计算的高效替代方案。

pandas DataFrame 基础遍历与列名获取

当对pandas.DataFrame对象直接使用for循环时,默认行为是调用其内部的__iter__方法,依次返回每一列的列名(字符串类型)。该操作仅用于获取元数据,无法直接访问单元格数据。

import pandas as pd

df = pd.DataFrame({'age': [24, 42], 'state': ['NY', 'CA'], 'point': [64, 92]},
                  index=['Alice', 'Bob'])

for column_name in df:
    print(type(column_name))
    print(column_name)
    print('======\n')
# <class 'str'>
# age
# ======
# 
# <class 'str'>
# state
# ======
# 
# <class 'str'>
# point
# ======

逐行列检索的标准流程

第1步:利用iteritems与iterrows进行行列遍历

df.iteritems() 用于逐列获取数据。每次迭代返回包含列名与对应Series对象的元组。适合需要对整列进行条件过滤或聚合计算的场景。

for column_name, item in df.iteritems():
    print(type(column_name))
    print(column_name)
    print('~~~~~~')
    print(type(item))
    print(item)
    print('------')
    # 演示通过索引名称或位置提取值
    print(item['Alice'])
    print(item[0])
    print(item.Alice)
    print('======\n')
# <class 'str'>
# age
# ~~~~~~
# <class 'pandas.core.series.Series'>
# Alice   24
# Bob     42
# Name: age, dtype: int64
# ------
# 24
# 24
# 24
# ======

df.iterrows() 用于逐行获取数据。返回包含行索引与代表该行数据的Series对象。Series支持通过列名或整数位置访问字段值。

for index, row in df.iterrows():
    print(type(index))
    print(index)
    print('~~~~~~')
    print(type(row))
    print(row)
    print('------')
    print(row['point'])
    print(row[2])
    print(row.point)
    print('======\n')
# <class 'str'>
# Alice
# ~~~~~~
# <class 'pandas.core.series.Series'>
# age     24
# state   NY
# point   64
# Name: Alice, dtype: object
# ------
# 64
# 64
# 64
# ======

第2步:使用itertuples快速生成命名元组

df.itertuples() 性能显著优于iterrows,返回由索引开头拼接行字段的命名元组(namedtuple)。由于具备属性访问能力,代码可读性更高且开销更小。若不需要命名元组,可设置name=None获取普通元组。

for row in df.itertuples():
    print(type(row))
    print(row)
    print('------')
    print(row[3])  # 按位置访问
    print(row.point)  # 按属性访问
    print('======\n')
# <class 'pandas.core.frame.Pandas' or namedtuple>
# Pandas(Index='Alice', age=24, state='NY', point=64)
# ------
# 64
# 64
# ======

for row in df.itertuples(name=None):
    print(type(row))
    print(row)
    print('------')
    print(row[3])
    print('======\n')
# <class 'tuple'>
# ('Alice', 24, 'NY', 64)
# ------
# 64
# ======

特定列取值与多列并行处理

第3步:提取指定列数值与zip组合

若仅需处理少数字段,直接提取对应的Series对象并在for循环中展开是最简洁的做法。DataFrame的单个列本质是pandas.Series,直接迭代即返回该列的值序列。配合内置zip()函数可实现多列同步遍历。

for age in df['age']:
    print(age)
# 24
# 42

for age, point in zip(df['age'], df['point']):
    print(age, point)
# 24 64
# 42 92

如需同时获取行索引,可直接迭代df.index属性。索引与任意列均可通过zip进行并行打包。

for index, state in zip(df.index, df['state']):
    print(index, state)
# Alice NY
# Bob CA

迭代更新值的注意事项与优化

第4步:安全更新DataFrame元素值

使用iterrows遍历时,返回的Series仅为原始数据的浅层副本。若在循环内直接修改row['point'] += row['age'],原始DataFrame不会发生任何变化。这是新手最容易踩的数据丢失陷阱。

for index, row in df.iterrows():
    row['point'] += row['age']

print(df)
#       age state  point
# Alice  24    NY     64
# Bob    42    CA     92  # 未更新

正确做法是结合.at[]定位器显式写入原始表:df.at[index, 'point'] += row['age']。该方法能精准修改目标单元格。

for index, row in df.iterrows():
    df.at[index, 'point'] += row['age']

print(df)
#       age state  point
# Alice  24    NY     88
# Bob    42    CA    134

第5步:采用向量化运算替代逐行循环

在实际生产环境中,绝大多数按列算术运算、函数映射或字符串处理均可通过pandas内置的向量化操作一步完成。向量化不仅语法更精简,底层由C语言驱动,执行速度通常比for循环快数十倍以上。

直接对列进行加减乘除:

df['point'] += df['age']
print(df)
#       age state  point
# Alice  24    NY    112
# Bob    42    CA    176

添加新列并应用NumPy数学函数(注:旧版pd.np已废弃,建议使用独立numpy库):

import numpy as np
df['age_sqrt'] = np.sqrt(df['age'])
print(df)
#       age state  point  new  age_sqrt
# Alice  24    NY    112  160  4.898979
# Bob    42    CA    176  260  6.480741

处理文本列时,Series提供专用的.str访问器,链式调用即可完成大小写转换与截取:

df['state_0'] = df['state'].str.lower().str[0]
print(df)
#       age state  point  new  age_sqrt state_0
# Alice  24    NY    112  160  4.898979       n
# Bob    42    CA    176  260  6.480741       c

以上就是pandas DataFrame for循环迭代详细的核心方法与最佳实践,更多关于Python数据处理自动化资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。