My goal is to get unique hash value for a DataFrame. I obtain it out of .csv file. Whole point is to get the same hash each time I call hash() on it. My idea was that I create the function def _get_array_hash(arr): arr_hashable = arr.values arr_hashable.flags.writeable = False hash_ = hash(arr_hashable.data) return hash_ that is calling underlying numpy array, set it to immutable state and get hash of the buffer. INLINE UPD. As of 08.11.2016, this version of the function doesn't work anymore. Instead, you should use hash(df.values.tobytes()) See comments for the Most efficient property to hash for numpy array. END OF INLINE UPD. It works for regular pandas array: 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 But then I try to apply it to DataFrame obtained from a .csv file: 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 Can somebody explain me, how's that possible? I can create new DataFrame out of it, like new_data = pd.DataFrame(data=data_from_file.values, columns=data_from_file.columns, index=data_from_file.index) and it works again In [25]: _get_array_hash(new_data) Out[25]: -3546154109803008241 In [26]: _get_array_hash(new_data) Out[26]: -3546154109803008241 But my goal is to preserve the same hash value for a dataframe across application launches in order to retrieve some value from cache. Continue reading...