用熊猫循环遍历数据帧的最有效方法是什么?

新手上路,请多包涵

我想以顺序方式对数据框中的财务数据执行我自己的复杂操作。

例如,我正在使用从 Yahoo Finance 获取的以下 MSFT CSV 文件:

 Date,Open,High,Low,Close,Volume,Adj Close
2011-10-19,27.37,27.47,27.01,27.13,42880000,27.13
2011-10-18,26.94,27.40,26.80,27.31,52487900,27.31
2011-10-17,27.11,27.42,26.85,26.98,39433400,26.98
2011-10-14,27.31,27.50,27.02,27.27,50947700,27.27

....

然后我执行以下操作:

 #!/usr/bin/env python
from pandas import *

df = read_csv('table.csv')

for i, row in enumerate(df.values):
    date = df.index[i]
    open, high, low, close, adjclose = row
    #now perform analysis on open/close based on date, etc..

这是最有效的方法吗?鉴于 pandas 对速度的关注,我认为必须有一些特殊的函数来迭代值,以一种也检索索引的方式(可能通过生成器来提高内存效率)? df.iteritems 不幸的是只逐列迭代。

原文由 Muppet 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 322
2 个回答

最新版本的 pandas 现在包括一个用于迭代行的内置函数。

 for index, row in df.iterrows():

    # do some logic here

或者,如果您想要更快地使用 itertuples()

但是,unutbu 建议使用 numpy 函数来避免迭代行将产生最快的代码。

原文由 Nick Crawford 发布,翻译遵循 CC BY-SA 3.0 许可协议

Pandas 基于 NumPy 数组。使用 NumPy 数组加速的关键是一次对整个数组执行操作,而不是逐行或逐项执行。

例如,如果 close 是一个一维数组,并且您想要每天的百分比变化,

 pct_change = close[1:]/close[:-1]

这将整个百分比变化数组计算为一个语句,而不是

pct_change = []
for row in close:
    pct_change.append(...)

因此,请尽量避免 Python 循环 for i, row in enumerate(...) ,并考虑如何通过对整个数组(或数据帧)作为一个整体而不是逐行进行操作来执行计算。

原文由 unutbu 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题