如何高效遍历含不同长度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
相关产品推荐
相关产品推荐

