【问题标题】:Transform dataframe column with a hash value使用哈希值转换数据框列
【发布时间】:2021-02-12 16:21:29
【问题描述】:

这是我的数据框。

  Student  Studendid          Student  Studendid          Student  Studendid   
0   Stud1    1              0   Stud1    ah274as        0   Stud1    1
1   Stud2    2              1   Stud2    ah474as        1   Stud2    2  
2   Stud3    3              2   Stud3    ah454as        2   Stud3    3  
3   Stud4    4      hash    3   Stud4    48sdfds  hash  3   Stud4    4  
4   Stud5    5       ->     4   Stud5    dash241    ->  4   Stud5    5 
5   Stud6    6              5   Stud6    asda212        5   Stud6    6
6   Stud7    7              6   Stud7    askdkj2        6   Stud7    7  
7   Stud8    8              7    Sud8    kadhh23        7   Stud8    8  
8   Stud9    9              8   Stud9    asdhb27        8   Stud9    9  

基于学生,我想对学生 ID 进行哈希处理。 我已经尝试过hash() 功能。不幸的是,我还没有找到任何如何将其散列回来的方法。 我想散列,然后再次散列。 有什么方法可以散列Studend并将其散列回来?

df[Studendid] = df["Student"].hash()

【问题讨论】:

标签: python pandas hash


【解决方案1】:

喜欢@Ch3steR 评论:

这是正确的假设每个值都有一个唯一的“散列值”,但目前不存在这样的散列函数。每个哈希函数都容易发生冲突。

# Example for collision
hash(0.1) == hash(230584300921369408)
True

注意从 Python 3.3 开始,字符串和字节对象的值在散列处理之前会使用随机值进行加盐处理。这意味着字符串的值被修改为一个随机值,每次解释器启动时都会改变。这样做是为了避免dictionary hash attack

# Example taken martijn's answer: https://stackoverflow.com/a/27522708/12416453
>>> hash("235")
-310569535015251310

现在,打开一个新会话。

>>> hash("235")
-1900164331622581997

但如果只有几行数据可以使用:

使用帮助字典进行哈希,然后将交换key:values 映射回d1 字典并传递给Series.map

d2 = {hash(x):x  for x in df['Student']}
d1 = {v:k for k, v in d2.items()}

df['Studendid']= df['Student'].map(d1)
df['orig']= df['Studendid'].map(d2)
print (df)
  Student            Studendid   orig
0   Stud1  6001180169368329239  Stud1
1   Stud2 -1507322317280771023  Stud2
2   Stud3 -2262724814055039076  Stud3
3   Stud4   364063172999472918  Stud4
4   Stud5  8548751638627509914  Stud5
5   Stud6  5647607776109616031  Stud6
6   Stud7   729989721669472240  Stud7
7   Stud8  4828368150311261883  Stud8
8   Stud9  8466663427818502594  Stud9

【讨论】:

  • 这是正确的假设每个值都有一个唯一的“散列值”,但目前不存在这样的散列函数。每个哈希函数都容易发生冲突。
  • @jezrael 感谢您的快速回答! :) 祝你有个美好的一天!
  • @jezrael 我认为 ~ 1 mio - ~ 2 mio
  • 在答案中添加了一些相关细节。如果不正常,请随时恢复更改。
猜你喜欢
  • 2019-05-31
  • 2022-01-18
  • 2014-08-10
  • 2019-10-27
  • 2019-05-23
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多