Python Applymap需要时间来运行

时间:2016-05-31 18:46:57

标签: python pandas dataframe

我有一个带有计数的数据矩阵(55K X8.5k)。他们中的大多数都是零,但很少有像任何计数。让我们这样说:

 a  b  c
0  4  3  3
1  1  2  1
2  2  1  0
3  2  0  1
4  2  0  4

我想要将单元格值二进制化。

我做了以下事情:

df_preference=df_recommender.applymap(lambda x: np.where(x >0, 1, 0))

虽然代码工作正常,但运行需要很长时间。

为什么?

有更快的方法吗?

由于

编辑:

执行df.to_pickle

时出错
df_preference.to_pickle('df_preference.pickle')

我明白了:

---------------------------------------------------------------------------
SystemError                               Traceback (most recent call last)
<ipython-input-16-3fa90d19520a> in <module>()
      1 # Pickling the data to the disk
      2 
----> 3 df_preference.to_pickle('df_preference.pickle')

\\dwdfhome01\Anaconda\lib\site-packages\pandas\core\generic.pyc in to_pickle(self, path)
   1170         """
   1171         from pandas.io.pickle import to_pickle
-> 1172         return to_pickle(self, path)
   1173 
   1174     def to_clipboard(self, excel=None, sep=None, **kwargs):

\\dwdfhome01\Anaconda\lib\site-packages\pandas\io\pickle.pyc in to_pickle(obj, path)
     13     """
     14     with open(path, 'wb') as f:
---> 15         pkl.dump(obj, f, protocol=pkl.HIGHEST_PROTOCOL)
     16 
     17 

SystemError: error return without exception set

2 个答案:

答案 0 :(得分:3)

<强>更新

关于您的错误,请阅读this topicthis issue

尝试将您的DF保存为HDF5 - 它更方便。

您可能还想阅读此comparison ...

OLD回答:

试试这个:

In [110]: (df>0).astype(np.int8)
Out[110]:
   a  b  c
0  1  1  1
1  1  1  1
2  1  1  0
3  1  0  1
4  1  0  1

.applymap() - 最慢的方法之一,因为它进入每个单元格(基本上它在内部执行嵌套循环)。

df>0适用于矢量化数据,因此它可以更多更快

.apply() - 比.applymap()更快,因为它适用于列,但与df>0

相比仍然要慢得多

UPDATE2:较小的DF(1000 x 1000)上的时间比较,因为applymap()需要很长时间(55K x 9K)DF:

In [5]: df = pd.DataFrame(np.random.randint(0, 10, size=(1000, 1000)))

In [6]: %timeit df.applymap(lambda x: np.where(x >0, 1, 0))
1 loop, best of 3: 3.75 s per loop

In [7]: %timeit df.apply(lambda x: np.where(x >0, 1, 0))
1 loop, best of 3: 256 ms per loop

In [8]: %timeit (df>0).astype(np.int8)
100 loops, best of 3: 2.95 ms per loop

答案 1 :(得分:0)

你可以使用scipy sparsematrix。这将使计算仅与实际存在的数据相关,而不是对所有零进行操作。