如何基于数据框中两个变量的组合创建哈希算法?
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)
测试了一小部分数据,所以它应该也适合你:)
我是 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)
测试了一小部分数据,所以它应该也适合你:)