Pandas: 逐行遍历Pandas的DataFrame的最有效方法是什么?

创建于 2015-06-12  ·  6评论  ·  资料来源: pandas-dev/pandas

我已经尝试过功能df.iterrows()但是它的性能太差了。 鉴于iterrows()返回具有完整模式和元数据的Series ,而不仅仅是值(我需要的所有值),这并不奇怪。

我尝试过的第二种方法是for row in df.values ,这要快得多。 但是,我最近意识到df.values并不是DataFrame的内部数据存储,因为df.values会将所有dtypes转换为通用的dtype 。 例如,我的一列具有dtype int64但是df.values的dtype都是float64 。 因此,我怀疑df.values实际上创建了内部数据的另一个副本。

另外,另一个要求是,行迭代必须返回保留原始数据dtype的值列表。

Usage Question

最有用的评论

我认为df.itertuples()是您要寻找的东西-比迭代速度快:

In [10]: x = pd.DataFrame({'x': range(10000)})

In [11]: %timeit list(x.iterrows())
1 loops, best of 3: 383 ms per loop

In [12]: %timeit list(x.itertuples())
1000 loops, best of 3: 1.39 ms per loop

所有6条评论

在python中,对行进行迭代比进行矢量化操作要慢很多。

在第二种方法中转换类型,因为这是numpy数组df.values是什么)的工作方式。 DataFrame是基于列的,因此您可以具有多个dtype的单个DataFrame。 一旦按行迭代,所有内容都必须转换为包含所有内容的更通用的类型。 在您的情况下,整数转到float64

如果您以最小的工作示例描述问题,我们也许可以帮助您将其向量化。 您可能还对带有pandas标签的StackOverflow感到很幸运。

基本上,我想执行以下操作:

row_handler = RowHandler(sample_df)  # learn how to handle row from sample data
transformed_data = []
for row in df.values:
    transformed_data.append(row_handler.handle(row))
return transformed_data

我不拥有RowHandler类,因此只能逐行操作。

另一个类似的例子是机器学习,您可能拥有一个仅在行级别预测API的模型。

仍然有点含糊,无法提供帮助。 但是,如果RowHandler确实超出了您的控制范围,那么您将失去运气。 FWIW所有scikit-learn的API都在数组(如此多行)上运行。

我不知道怎么能更清楚。 是的, RowHandler无法控制。 运气是什么意思? 我的问题是最有效的方式来遍历行,同时保持每个元素的dtype完好无损。 您是否建议df.iterrows()或其他?

sklearn是一个例外,不是规范,它在PD的DataFrame上本地运行。 很少有机器学习库具有可在DataFrame上运行的API。

我认为df.itertuples()是您要寻找的东西-比迭代速度快:

In [10]: x = pd.DataFrame({'x': range(10000)})

In [11]: %timeit list(x.iterrows())
1 loops, best of 3: 383 ms per loop

In [12]: %timeit list(x.itertuples())
1000 loops, best of 3: 1.39 ms per loop

谢谢@shoyer! 那就是我所需要的。

此页面是否有帮助?
0 / 5 - 0 等级