我已经尝试过功能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
的值列表。
在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! 那就是我所需要的。
最有用的评论
我认为
df.itertuples()
是您要寻找的东西-比迭代速度快: