我有一个非常大的数据帧,它有100年的日期作为列标题(即大约36500列),100年的日期作为索引(即大约36500行)。我有一个函数,它计算数据帧的每个元素的值,需要运行36500^2次。在
好的,问题不在于函数的快速性,而在于给数据帧赋值。即使我用这种方式分配一个常数,每6个赋值也需要1秒的时间。很明显,你可以看出我很胖:
for i, row in df_mBase.iterrows():
for idx, val in enumerate(row):
df_mBase.ix[i][idx] = 1
print(i)
通常在C/Java中,我只需通过一个36500x36500的双循环进行循环,并通过索引直接访问预先分配的内存,这可以在恒定的时间内实现,几乎没有任何开销。但在python中这似乎不是一个选项?在
在数据帧中存储这些数据的最快方法是什么?不管是不是Python,我只追求速度-我不喜欢优雅。在
您应该使用原生python或numpy创建数据结构,并将数据传递给DataFrame构造函数。如果您的函数可以使用numpy的函数/操作编写,那么您可以使用numpy的向量化特性来避免在所有索引上循环。在
下面是一个使用合成函数的示例:
有几个原因可以解释为什么这可能会变慢
.九
{{label{1}和cdr}都是基于索引的{1},但对于cd1}和cd1}都是严格的索引。 我假设
.ix
在幕后做了很多魔术,以确定是否需要标签或基于位置的索引.I错误
返回一个(新的?)
Series
表示每行。基于列的迭代可能更快,比如.iteritems
在列上迭代【】【】
df_mBase.ix[i][idx]
返回一个Series
,然后从中获取元素idx
,该元素的值为1。在应该改善一下
标杆管理
^{pr2}$结论
如果可以使用矢量化,请这样做。根据计算结果,可以使用其他方法。如果您只需要使用的值,
applymap
似乎最快。如果还需要索引和或列,请使用列如果不能向量化,
df[column][index] = x
的工作速度最快,以df.iteritems()
作为一个接近的秒迭代列相关问题 更多 >
编程相关推荐