在python pandas的dataframe中为每一行数据创建哈希值
这些解决方案适用于 Python 进程的整个生命周期。
如果顺序很重要,一种方法是将行(一个 Series 对象)强制转换为一个元组:
>>> hash(tuple(df.irow(1)))
-4901655572611365671
这说明了元组散列的顺序问题:
>>> hash((1,2,3))
2528502973977326415
>>> hash((3,2,1))
5050909583595644743
要对每一行执行此操作,附加为一列将如下所示:
>>> df = df.drop('hash', 1) # lose the old hash
>>> df['hash'] = pd.Series((hash(tuple(row)) for _, row in df.iterrows()))
>>> df
y x0 hash
0 11.624345 10 -7519341396217622291
1 10.388244 11 -6224388738743104050
2 11.471828 12 -4278475798199948732
3 11.927031 13 -1086800262788974363
4 14.865408 14 4065918964297112768
5 12.698461 15 8870116070367064431
6 17.744812 16 -2001582243795030948
7 16.238793 17 4683560048732242225
8 18.319039 18 -4288960467160144170
9 18.750630 19 7149535252257157079
[10 rows x 3 columns]
如果顺序无关紧要,请使用 freezesets 的哈希而不是元组:
>>> hash(frozenset((3,2,1)))
-272375401224217160
>>> hash(frozenset((1,2,3)))
-272375401224217160
避免对行中所有元素的哈希求和,因为这可能在密码学上不安全,并导致哈希超出原始范围。
(您可以使用模数来限制范围,但这相当于滚动您自己的哈希函数,最佳做法是不。)
您可以制作永久的加密质量哈希,例如使用 sha256 以及使用 the hashlib module.
PEP 452 中有一些关于加密哈希函数 API 的讨论。
感谢用户 Jamie Marshal 和 Discrete Lizard 的 cmets。