根据熊猫数据帧的索引从稀疏矩阵中选择行

时间:2015-10-19 04:41:20

标签: python pandas scipy

假设我有一个形状=(2,500,000,M)的熊猫数据帧和一个scipy csr稀疏形状矩阵(2,500,000,N)。

数据帧和稀疏矩阵的每一行描述一个实体。它们已被排序,使得数据帧的第1行描述也在稀疏矩阵的第1行中找到的实体。那么现在数据帧有一个快速的过滤机制(catalogue.where(catalogue.some_column != ''),但是如何在给定过滤数据帧的情况下在稀疏矩阵中找到相应的行?

假设数据帧称为catalogue,稀疏矩阵称为collection

def collection_filter_row(catalogue_filtered, catalogue_index_full, collection):
    return scipy.sparse.vstack(ThreadPool(100).map(
        functools.partial(collection_get_row,
             catalogue_index=tuple(catalogue_index_full),
             collection=collection),
        tuple(catalogue_filtered.index.values)))

def collection_get_row(document_id, catalogue_index, collection):
    return collection.getrow(catalogue_index.index(document_id))

collection_partial = partial(
    collection_filter_row,
    catalogue_index_full=catalogue.index.values,
    collection=pickle.load(open('collection-tfidf', 'rb')))
criteria = catalogue['criteria'].where(catalogue.criteria != '')
collection_state = collection_partial(criteria)

但是即使使用任何类型的多处理(gevent,threadpool),选择相应的行仍然很慢,我做错了什么(或者更确切地说,是否有更快的方法)?

1 个答案:

答案 0 :(得分:1)

以某种方式找到了解决此问题的更快方法。首先创建catalogue index =>字典collection索引。

index_dict = dict(zip(
    catalogue.index.values.tolist(),
    range(collection.shape[0])))

然后我的collection_filter_row变为

def collection_filter_row(catalogue_filtered, index_dict, collection):
    return collection[[index_dict[document_id]
                       for document_id
                       in catalogue_filtered.index.values.tolist()]]

为了返回集合的子集,而不是使用catalogue.where()我应该使用catalogue.loc[catalogue.some_column != ''],因此正确调用collection_filter_row

collection_sub = collection_filter_row(
    catalogue.loc[catalogue.some_column != ''],
    index_dict,
    collection)

比问题中显示的原始方法快得多