熊猫:快速加入MultiIndex或重建索引

时间:2014-10-05 07:50:20

标签: python pandas dataframe sparse-array

我有一些非常稀疏的多维时间序列,在某些时间具有活动,在其他时间具有零活动。我将Pandas中的数据表示为SparseDataframeMultiIndex。工作流程是对非零的小数据集执行计算,然后将结果放入大型稀疏数据帧中。稍后我将对稀疏数据帧进行计算(即跟踪活动随时间的变化,包括零活动区域)。

问题在于将少量数据放入稀疏数据帧中。下面是一个比我最终使用的数据集小得多的数据集。

使用常规索引就可以了:

import pandas as pd
full_index = arange(10000000) #10 million
sparse_data = full_index[:20000]
sparse_df = pd.SparseDataFrame(index=full_index)
data_df = pd.DataFrame(index=sparse_data,columns=['Data'], data=1) #Calculations would go here.

%time sparse_df.join(data_df)
CPU times: user 888 ms, sys: 225 ms, total: 1.11 s
Wall time: 1.56 s

使用MultiIndex会慢得多!

full_index = pd.MultiIndex.from_product([arange(2),
                                         arange(5),
                                         arange(1000000)]) #Still 10 million
sparse_data = full_index[:20000]
sparse_df = pd.SparseDataFrame(index=full_index)
data_df = pd.DataFrame(index=sparse_data,columns=['Data'], data=1)

%time sparse_df.join(data_df)
CPU times: user 13.8 s, sys: 1.82 s, total: 15.6 s
Wall time: 16.6 s #10x slower!

我认为问题可能在于使用join,所以我尝试了另一条路线。它更快但没有解决问题。

#regular Index
%time sparse_df['Data'] = data_df.reindex(full_index).to_sparse()['Data'] #The reindexing is the slow part
CPU times: user 318 ms, sys: 129 ms, total: 448 ms
Wall time: 448 ms

#MultiIndex
%time sparse_df['Data'] = data_df.reindex(full_index).to_sparse()['Data'] #The reindexing is the slow part
CPU times: user 9.33 s, sys: 1.02 s, total: 10.3 s
Wall time: 10.4 s #20x slower!

使用reindex代替join确实更快,但现在MultiIndex甚至更慢,相对而言!

我有什么选择?有没有办法用MultiIndex来实现常规索引的速度?是否有一种优雅的方法来制作像MultiIndex这样的常规索引函数?我应该重新思考如何做到这一切吗?

0 个答案:

没有答案