Моя цель - получить уникальное значение хэша для 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, установите его в неизменяемое состояние и получите хэш из буфера.
INLINE UPD.
Начиная с 08.11.2016, эта версия функции больше не работает. Вместо этого вы должны использовать
hash(df.values.tobytes())
См. комментарии для Наиболее эффективное свойство хэша для массива numpy.
END OF INLINE 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
Но потом я пытаюсь применить его к DataFrame, полученному из файла .csv:
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
Но моя цель - сохранить одно и то же значение хэша для фрейма данных во всех запусках приложений, чтобы получить некоторое значение из кеша.