如何基于数据框中两个变量的组合创建哈希算法?

How do I create a hashing algorithim based on a combination of two variables in a dataframe?

我是 python 的新手,正在研究哈希算法。

我有一个数据框-

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等的另一种唯一加密。只要组合是唯一的。我想要独特的加密。如果他们重复,那么加密应该是相同的。我对其他建议持开放态度,比如一种热编码,以防 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

这是我的尝试:

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 次幂作为乘数。这有效地 left-shifts 所有 CID 值 10 位,因此所有 10 个 LSB 位现在都为零。然后我们使用加法用 SID 值填充那些 LSB 位。

无论哪种方式,最终表示都需要是编码的字节字符串,因此是 str(integer_stuff).encode('utf8') 部分。最后,我们将该结果包含在 hashlib.md5() 中并调用 .hexdigest() 以检索哈希的十六进制字符串表示形式。

就 Pandas 本身而言,欢迎对我的方法进行改进 :) 但我认为我的散列方法本身非常合理。

编辑:

为了将结果连接到原始 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)

测试了一小部分数据,所以它应该也适合你:)