У меня есть функция, которая хэширует значения int, существующие в столбце pd.DataFrame
some_id
.Моя проблема в том, что в конце я вынужден использовать pd.Series.apply
, чтобы использовать md5(x).hexdigest()
.Если apply(f)
вызывается для кадра данных со значительным размером строки, это вызовет огромные проблемы с производительностью (время + память), потому что вызовы функций в python ужасны.Поэтому, если он применяется на 10 миллионов строк ... OOM kill
неизбежно.(Я пробовал)
Следующая функция делает именно то, что должна, часть, которую нужно изменить, отмечена ниже #TODO
import pandas as pd
import numpy as np
from hashlib import md5
from pandas.api.types import is_numeric_dtype
def hash_some_id(data: pd.DataFrame) -> pd.DataFrame:
# Remove all na and 0 values in order to encode the rest
data_to_encode = data.copy()
data_to_encode = data.replace(0, np.nan)
data_to_encode.dropna(inplace=True)
if is_numeric_dtype(data_to_encode.some_id):
# Convert the int some_id to str and prepend 0 to it
data_to_encode.some_id = "0" + data_to_encode.some_id.astype(str)
# Encode to binary
data_to_encode.some_id = data_to_encode.some_id.str.encode('ascii')
# TODO : Optimize this
# This is inefficient as it is applied on each row of data.
# Find a way to vectorize it
encoded_data = data_to_encode.some_id.apply(lambda x : md5(x).hexdigest())
return encoded_data