Как создать алгоритм хеширования на основе комбинации двух переменных в кадре данных? - PullRequest
3 голосов
/ 05 августа 2020

Я новичок в python и работаю над хешированием al go.

У меня есть dataframe-

df2
Out[55]: 
         CID                 SID
0        2094825             141
1        2327668             583
2        2259956             155
3        1985370             100
4        2417177              47
         ...             ...
1030748  2262027             100
1030749  2232061             100
1030750  2027795             169
1030751  2474609             100
1030752  2335654             169

[1030753 rows x 2 columns]

Как мне использовать библиотеку hashlib python, чтобы получить алгоритм хеширования, такой, что каждая комбинация CID и STD дает мне уникальное шифрование, такое как CID 2262027 и SID 100 - fj6x55, а CID 2232061 и SID 100 дают другое уникальное шифрование f6223xi, et c. Пока комбинации уникальны. Я хочу уникальное шифрование. Если они повторяются, то шифрование должно быть таким же. Я открыт для других предложений, например, одно горячее кодирование, если hashlib не работает. Пока я получаю сообщение об ошибке -

import hashlib
x = hashlib.md5(df2['SID'])
Traceback (most recent call last):

  File "<ipython-input-60-44772f235990>", line 1, in <module>
    x = hashlib.md5(df2['SubDiagnosisId'])

TypeError: object supporting the buffer API required

1 Ответ

1 голос
/ 05 августа 2020

Вот моя попытка:

hashes = df2.apply(lambda x:hashlib.md5((str(x[0])+str(x[1])).encode('utf8')).hexdigest(), axis=1)

Некоторые пояснения:

df2.apply принимает функцию, в данном случае анонимную функцию lambda , а также ось, к которой мы хотим применить функцию. В этом случае для каждой строки применяется axis=1.

Разбивка хеш-функции:

Анонимная функция принимает один аргумент x, который состоит из двух столбцов. Мы разбиваем x на x[0] (CID первого столбца) и x[1] (SID второго столбца).

Здесь у нас есть два варианта. Мы можем либо преобразовать целые числа в строки и объединить строки, как я сделал здесь, либо умножить значение CID на некоторую константу, равную как минимум max(SID). Однако я думаю, что объединение строк может быть недостаточно уникальным для этого случая. Лучшим подходом может быть следующий:

df.apply(lambda x:hashlib.md5(str(x[0]*1024+x[1]).encode('utf8')).hexdigest(), axis=1)

Вы заметили, что максимальное значение SID составляет 583, поэтому я выбрал следующую доступную степень 2 в качестве множителя. Это эффективно сдвигает влево все значения CID на 10 бит, так что все 10 бит LSB теперь равны нулю. Затем мы заполняем эти LSB-биты значениями SID, используя сложение.

В любом случае окончательное представление должно быть закодированной байтовой строкой, следовательно, частью str(integer_stuff).encode('utf8'). Наконец, мы заключаем этот результат в hashlib.md5() и вызываем .hexdigest(), чтобы получить шестнадцатеричное строковое представление ha sh.

Приветствуются улучшения моего подхода в отношении самого Pandas: ), но я думаю, что мой подход к хешированию вполне обоснован.

EDIT:

Чтобы присоединить результат к исходному DataFrame, попробуйте следующее:

# Calculate the hashes. This gives you a Series.
hashes = df2.apply(lambda x:hashlib.md5((str(x[0])+str(x[1])).encode('utf8')).hexdigest(), axis=1)
# Create a DataFrame from the above Series
df_hash = pd.DataFrame(hashes, columns=['hash'])
# Join the hashes with the original DataFrame
df2 = df2.join(df_hash)

Протестировано с небольшим набором данных, так что вам тоже подойдет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...