[Python] Get the same hash value for a Pandas DataFrame each time

Discussão em 'Python' iniciado por Stack, Abril 11, 2025.

  1. Stack

    Stack Membro Participativo

    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...

Compartilhe esta Página