【问题标题】:Hashing Pandas dataframe breaks散列 Pandas 数据帧中断
【发布时间】:2017-10-27 01:50:01
【问题描述】:

第一次导入:

import pandas as pd
import numpy as np
import hashlib

接下来,考虑以下几点:

np.random.seed(42)
arr = np.random.choice([41, 43, 42], size=(3,3))
df = pd.DataFrame(arr)
print(arr)
print(df)
print(hashlib.sha256(arr.tobytes()).hexdigest())
print(hashlib.sha256(df.values.tobytes()).hexdigest())

多次执行这个 sn-p 总是两次产生相同的哈希值:ddfee4572d380bef86d3ebe3cb7bfa7c68b7744f55f67f4e1ca5f6872c2c9ba1

但是,如果我们考虑以下情况:

np.random.seed(42)
arr = np.random.choice(['foo', 'bar', 42], size=(3,3))
df = pd.DataFrame(arr)
print(arr)
print(df)
print(hashlib.sha256(arr.tobytes()).hexdigest())
print(hashlib.sha256(df.values.tobytes()).hexdigest())

注意现在数据中有字符串。 arr 的哈希值对于不同的评估是固定的 (52db9328682317c44370b8186a5c6bae75f2a94c9d0d5b24d61f602857acd3de),但 pandas.DataFrame 的哈希值每次都会改变。

有什么pythonic的方法吗?没有 Pythonic?

编辑:相关链接:

【问题讨论】:

    标签: python pandas numpy hash


    【解决方案1】:

    据我说,当您使用字符串作为单元格的值时。数据框类型为对象

    df.dtypes
    

    表明了这一点。 这就是为什么你每次都会得到不同的哈希值。

    【讨论】:

      【解决方案2】:

      简单的解决方法是获取整个数据帧的字符串表示形式并对其进行哈希处理。特别是以下任何一项都可以工作:

      print(hashlib.sha256(df.to_json().encode()).hexdigest())
      print(hashlib.sha256(df.to_csv().encode()).hexdigest())
      

      当然,这对于大数据帧来说会很长。

      不过,它仍然是 pd.DataFrame(arr).values != arr,这是违反直觉的。

      查看摘要:https://gist.github.com/drorata/bfc5d956c4fb928dcc77510a33009691

      【讨论】:

      【解决方案3】:

      我写了一个package,其中包含SeriesDataFrame 的可散列子类以满足我的需要。希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        从 0.20.1 版本开始,可以使用 pandas.util.hash_pandas_object 函数对 pandas DataFrameSeries 进行哈希处理。

        【讨论】:

          猜你喜欢
          • 2020-05-29
          • 2023-03-05
          • 2012-12-27
          • 2020-12-04
          • 1970-01-01
          • 1970-01-01
          • 2019-12-21
          • 1970-01-01
          • 2017-11-10
          相关资源
          最近更新 更多