遍历pandas Series元素的最佳方法是什么?各常用方式有何区别
Pandas Series 五种遍历方式对比及最优选择
各遍历方式核心差异
- 方式1:
for el in arr直接迭代
Series默认的迭代逻辑,直接返回对应位置的Python原生标量值,内部调用__iter__方法实现,不需要额外处理索引,性能中等,会丢失pandas特有的数据类型信息。 - 方式2:
for _, el in arr.iteritems()迭代
该方法会成对返回(索引, 元素值)元组,示例中用_忽略了索引才只获取元素值。如果场景需要同时使用索引和对应元素,这是pandas官方推荐的实现方式,比单独获取索引再查询值的效率更高。pandas 2.0+版本中iteritems()和items()方法完全等价,可以互相替换。 - 方式3:
for el in arr.array迭代arr.array返回pandas原生扩展数组(ExtensionArray),完整保留pandas的所有类型特性(比如可空类型、分类类型、字符串类型等特殊dtype),迭代返回的是pandas标量类型,不会做隐式类型转换,适合需要保留pandas数据特性的场景。 - 方式4:
for el in arr.values迭代values属性返回numpy数组,若Series存储的是numpy兼容的基础数据类型,会直接返回对应类型的numpy数组,是所有遍历方式中性能最高的。但如果Series用了pandas特有扩展类型,values可能会做隐式类型转换(比如可空Int64类型转成object类型数组),存在类型污染的风险,官方现在更推荐用arr.to_numpy()替代values,类型转换逻辑更可控。 - 方式5:下标+
iloc迭代
这是所有方式中最不推荐的实现,每次循环都要调用一次iloc做位置查询,iloc的每次调用都有额外的查找开销,数据量较大时性能会比其他方式低数倍到数十倍,代码可读性也差。
实际应用最优选择
按场景优先级选择即可:
- 仅需遍历元素值,不需要保留pandas特殊类型:优先选
arr.values或更规范的arr.to_numpy(),性能最高,内存开销最小。 - 需要同时获取索引和对应元素值:直接用
iteritems()/items(),是官方原生支持的索引值成对返回方案,效率最优。 - 需要保留pandas扩展类型特性,避免隐式类型转换:选择
arr.array遍历,完全保留pandas原生数据属性。 - 任何场景下都不推荐使用下标+
iloc的遍历方式。
内容的提问来源于stack exchange,提问作者d.b
相关产品推荐
相关产品推荐

