You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效遍历含不同长度numpy数组的pandas DataFrame行?

解决方案

对于这种每行包含不规则长度numpy数组的DataFrame,要逐行生成a vs b、a vs c的图表,你可以用以下几种比iterrows()更高效的方法:


方法1:使用df.apply()(代码最简洁)

apply()支持按行(axis=1)执行自定义函数,可读性强,性能优于iterrows()。

示例代码:

import matplotlib.pyplot as plt

def plot_row(row):
    # 绘制a vs b
    plt.figure()
    plt.scatter(row['a'], row['b'])
    plt.title(f"{row['Tag']} - a vs b (Num: {row['Num']})")
    plt.xlabel('a')
    plt.ylabel('b')
    
    # 绘制a vs c
    plt.figure()
    plt.scatter(row['a'], row['c'])
    plt.title(f"{row['Tag']} - a vs c (Num: {row['Num']})")
    plt.xlabel('a')
    plt.ylabel('c')

# 按行应用绘图函数
df.apply(plot_row, axis=1)
plt.show()

方法2:使用df.itertuples()(性能最优)

itertuples()返回命名元组,避免了iterrows()的Series格式转换开销,大数据量下速度优势明显。

示例代码:

import matplotlib.pyplot as plt

for row in df.itertuples(index=False):
    # 绘制a vs b
    plt.figure()
    plt.scatter(row.a, row.b)
    plt.title(f"{row.Tag} - a vs b (Num: {row.Num})")
    plt.xlabel('a')
    plt.ylabel('b')
    
    # 绘制a vs c
    plt.figure()
    plt.scatter(row.a, row.c)
    plt.title(f"{row.Tag} - a vs c (Num: {row.Num})")
    plt.xlabel('a')
    plt.ylabel('c')

plt.show()

方法3:遍历索引+df.loc[](逻辑最直观)

直接遍历DataFrame索引,用loc提取整行数据,性能同样优于iterrows(),适合需要手动控制索引的场景。

示例代码:

import matplotlib.pyplot as plt

for idx in df.index:
    row = df.loc[idx]
    # 绘制a vs b
    plt.figure()
    plt.scatter(row['a'], row['b'])
    plt.title(f"{row['Tag']} - a vs b (Num: {row['Num']})")
    plt.xlabel('a')
    plt.ylabel('b')
    
    # 绘制a vs c
    plt.figure()
    plt.scatter(row['a'], row['c'])
    plt.title(f"{row['Tag']} - a vs c (Num: {row['Num']})")
    plt.xlabel('a')
    plt.ylabel('c')

plt.show()

补充:为什么不推荐iterrows()?

iterrows()返回的是每行的Series对象,每次迭代都要做数据格式转换,在数据量大时会产生明显的性能损耗;而上述三种方法要么避免了不必要的格式转换,要么底层实现更高效。

内容的提问来源于stack exchange,提问作者DeltaIV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:30:23