Pandas遍歷DataFrame每一行的多種方法
更新時間:2025年09月15日 08:51:38 作者:袁袁袁袁滿
Pandas遍歷DataFrame有多種方法:iterrows(返回Series,適合需索引)、itertuples(命名元組,高性能)、apply(向量化計算)、df.values(最快但無列名),最佳實踐是優(yōu)先使用向量化操作,避免逐行遍歷,大數(shù)據(jù)推薦dask或swifter加速,下面由小編給大家詳細說說
在 Pandas 中,遍歷 DataFrame 的每一行有多種方法,每種方法適用于不同的場景。以下是常見的幾種方式及其適用場景:
1. iterrows() - 返回索引和行數(shù)據(jù)(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 類型)。 - 適用場景:需要訪問行索引和少量數(shù)據(jù)時。
2. itertuples() - 返回命名元組(更快)
for row in df.itertuples():
print(f"索引: {row.Index}, A列值: {row.A}, B列值: {row.B}")
特點:
- 返回
namedtuple,訪問列名更方便(如row.A而不是row['A'])。 - 優(yōu)點:比
iterrows()快很多(因為直接操作元組)。 - 適用場景:需要高性能遍歷,且不需要修改數(shù)據(jù)。
3. apply() - 對每行應用函數(shù)(推薦)
def process_row(row):
return f"A={row['A']}, B={row['B']}"
df.apply(process_row, axis=1) # axis=1 表示按行應用
特點:
- 使用向量化操作,比
iterrows()/itertuples()更快。 - 適用場景:需要對每行進行計算并返回新數(shù)據(jù)。
4. items() - 遍歷列(而非行)
for col_name, col_data in df.items():
print(f"列名: {col_name}")
print(f"列數(shù)據(jù):\n{col_data}")
特點:
- 遍歷的是 列 而不是行。
- 適用場景:需要按列處理數(shù)據(jù)時。
5. 直接轉(zhuǎn)換為 NumPy 數(shù)組(最快)
for row in df.values: # 或 df.to_numpy()
print(f"A={row[0]}, B={row[1]}") # 按列索引訪問
特點:
- 直接操作 NumPy 數(shù)組,速度最快。
- 缺點:丟失列名,只能按索引訪問。
- 適用場景:需要極致性能,且不需要列名。
6. 使用 loc 或 iloc 訪問特定行
for i in range(len(df)):
print(df.loc[i, 'A']) # 按標簽訪問
print(df.iloc[i, 0]) # 按位置訪問
特點:
- 適用于隨機訪問特定行。
- 缺點:性能較差(每次調(diào)用
loc/iloc都有開銷)。
性能對比
| 方法 | 速度 | 適用場景 |
|---|---|---|
| itertuples() | ???? | 高性能遍歷 |
| apply() | ??? | 向量化操作 |
| iterrows() | ? | 需要索引時 |
| df.values | ????? | 極致性能(無列名) |
| loc / iloc | ? | 隨機訪問 |
最佳實踐
- 盡量避免逐行遍歷,優(yōu)先使用 Pandas 的向量化操作(如
df['A'] * 2)。 - 如果必須遍歷:
- 需要列名 →
itertuples() - 需要極致性能 →
df.values或to_numpy() - 需要修改數(shù)據(jù) →
iterrows()或apply()
- 需要列名 →
- 大數(shù)據(jù)處理:考慮
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'
總結(jié)
| 需求 | 推薦方法 |
|---|---|
| 高性能遍歷 | itertuples() |
| 需要修改數(shù)據(jù) | apply() 或 iterrows() |
| 極致性能 | df.values |
| 向量化計算 | 直接使用 Pandas/NumPy 操作 |
盡量避免逐行遍歷,Pandas 的優(yōu)勢在于 向量化計算!
到此這篇關(guān)于Pandas遍歷DataFrame每一行的多種方法的文章就介紹到這了,更多相關(guān)Pandas遍歷DataFrame每一行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Python的Flask框架中實現(xiàn)單元測試的教程
這篇文章主要介紹了在Python的Flask框架中實現(xiàn)單元測試的教程,屬于自動化部署的方面,可以給debug工作帶來諸多便利,需要的朋友可以參考下2015-04-04
Win10+python3.6+git運行出現(xiàn)問題的解決
這篇文章主要介紹了Win10+python3.6+git運行出現(xiàn)問題的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
Python任務調(diào)度模塊APScheduler使用
這篇文章主要介紹了Python任務調(diào)度模塊APScheduler使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04

