首页 > 解决方案 > 大熊猫中的矢量化散列函数

问题描述

我有以下数据集(具有不同的值,只是乘以相同的行)。我需要组合这些列并对它们进行哈希处理,特别是使用库 hashlib 和提供的算法。

问题是它花费的时间太长,不知何故我觉得我可以对函数进行矢量化,但我不是专家。

该功能非常简单,我觉得它可以矢量化,但很难实现。

我正在处理数百万行,即使散列 4 列值也需要数小时。

import pandas as pd
import hashlib

data = pd.DataFrame({'first_identifier':['ALP1x','RDX2b']* 100000,'second_identifier':['RED413','BLU031']* 100000})

def _mutate_hash(row):
    return hashlib.md5(row.sum().lower().encode()).hexdigest()

%timeit data['row_hash']=data.apply(_mutate_hash,axis=1)

标签: pythonpandasvectorization

解决方案


使用列表推导可以显着加快速度。

首先是您的原件:

import pandas as pd
import hashlib

n = 100000
data = pd.DataFrame({'first_identifier':['ALP1x','RDX2b']* n,'second_identifier':['RED413','BLU031']* n})

def _mutate_hash(row):
    return hashlib.md5(row.sum().lower().encode()).hexdigest()

%timeit data['row_hash']=data.apply(_mutate_hash,axis=1)

1 loop, best of 5: 26.1 s per loop

然后作为列表理解:

data = pd.DataFrame({'first_identifier':['ALP1x','RDX2b']* n,'second_identifier':['RED413','BLU031']* n})

def list_comp(df):
    return pd.Series([ _mutate_hash(row) for row in df.to_numpy() ])

%timeit data['row_hash']=list_comp(data)

1 loop, best of 5: 872 ms per loop

...即,加速约 30 倍。

作为检查:您可以通过将第一个方法放在“data2”中,将第二个方法放在“data3”中来检查这两种方法是否产生相同的结果,然后检查它们是否相等:

data2, data3 = pd.DataFrame([]), pd.DataFrame([])
%timeit data2['row_hash']=data.apply(_mutate_hash,axis=1)
...
%timeit data3['row_hash']=list_comp(data)
...
data2.equals(data3)
True

推荐阅读