【发布时间】:2015-10-12 13:55:53
【问题描述】:
我的目标是获取 DataFrame 的唯一哈希值。我从 .csv 文件中获取它。 重点是每次我调用 hash() 时都得到相同的哈希值。
我的想法是创建函数
def _get_array_hash(arr):
arr_hashable = arr.values
arr_hashable.flags.writeable = False
hash_ = hash(arr_hashable.data)
return hash_
调用底层 numpy 数组,将其设置为不可变状态并获取缓冲区的哈希值。
内联更新。
自 08.11.2016 起,此版本的功能不再起作用。相反,您应该使用
hash(df.values.tobytes())
Most efficient property to hash for numpy array 见 cmets。
内联 UPD 结束。
它适用于常规 pandas 数组:
In [12]: data = pd.DataFrame({'A': [0], 'B': [1]})
In [13]: _get_array_hash(data)
Out[13]: -5522125492475424165
In [14]: _get_array_hash(data)
Out[14]: -5522125492475424165
然后我尝试将其应用于从 .csv 文件中获得的 DataFrame:
In [15]: fpath = 'foo/bar.csv'
In [16]: data_from_file = pd.read_csv(fpath)
In [17]: _get_array_hash(data_from_file)
Out[17]: 6997017925422497085
In [18]: _get_array_hash(data_from_file)
Out[18]: -7524466731745902730
谁能解释一下,这怎么可能?
我可以用它创建新的DataFrame,比如
new_data = pd.DataFrame(data=data_from_file.values,
columns=data_from_file.columns,
index=data_from_file.index)
它又可以工作了
In [25]: _get_array_hash(new_data)
Out[25]: -3546154109803008241
In [26]: _get_array_hash(new_data)
Out[26]: -3546154109803008241
但我的目标是在应用程序启动时为数据帧保留相同的哈希值,以便从缓存中检索一些值。
【问题讨论】:
-
我尝试了获取索引和列的哈希值以及 str(data_frame) 值的方法。它很慢,并且遇到同样的问题。
-
我也有兴趣这样做 - 我能问一下你为什么包含“arr_hashable.flags.writeable = False”吗?您是否希望 hash() 函数可能会修改数组?
-
@MaxPower 这是很久以前的事了,所以我不记得了。但我想我受到了stackoverflow.com/questions/16589791/… 的启发。那时我已经工作了。现在它不起作用了,但是您可以使用
hash(a.data.tobytes())代替,并且您不再需要flags.writeable = False。请参阅参考答案的 cmets。 -
实际上,你甚至不需要
.data,如果从DataFrame调用,只需使用hash(a.tobytes())或hash(df.values.tobytes())。我已经更新了原来的问题。