Вот моя попытка:
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)
Протестировано с небольшим набором данных, так что вам тоже подойдет:)