python - 大熊猫中的矢量化散列函数
问题描述
我有以下数据集(具有不同的值,只是乘以相同的行)。我需要组合这些列并对它们进行哈希处理,特别是使用库 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)
解决方案
使用列表推导可以显着加快速度。
首先是您的原件:
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
推荐阅读
- ipad - 在 iPad 上滑动导航时,防止 VoiceOver 聚焦模态覆盖的元素
- c# - 我正在尝试将 Web 应用程序发布为部署包,并且在发布时出现以下错误
- c# - Datagrid ItemCommand 事件未触发
- python - 使用 K 折交叉验证标准化数据
- android - 如何发布具有 2 arm 构建支持的单个 apk?
- reactjs - 如何在功能组件中使用 PanResponder?
- maven - 将属性文件转换为抽象类
- oracle - 如果 oracle table1 为空,则输出 table2 否则输出 table1 本身;两个表上没有共同的列
- c++ - 如何在文件中更新
- javascript - Nativescript-vue 溢出对于边界外的绝对定位元素可见