我有一个带有计数的数据矩阵(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
答案 0 :(得分:3)
<强>更新强>
关于您的错误,请阅读this topic和this 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。这将使计算仅与实际存在的数据相关,而不是对所有零进行操作。