【问题标题】:How to generate a Hash or checksum value on Python Dataframe (created from a fixed width file)?如何在 Python Dataframe(从固定宽度文件创建)上生成哈希值或校验和值?
【发布时间】:2018-09-27 17:21:51
【问题描述】:

我有 2 个固定宽度的文件,如下所示(唯一的变化是从位置 14 开始的日期值)。

sample_hash1.txt

GOKULKRISHNA 04/17/2018
ABCDEFGHIJKL 04/17/2018
111111111111 04/17/2018

sample_hash2.txt

GOKULKRISHNA 04/16/2018
ABCDEFGHIJKL 04/16/2018
111111111111 04/16/2018

使用 pandas read_fwf 我正在读取此文件并创建一个数据框(通过排除仅加载前 13 个字符的日期值)。所以我的数据框看起来像这样。

import pandas as pd
df1 = pd.read_fwf("sample_hash1.txt", colspecs=[(0,13)])
df2 = pd.read_fwf("sample_hash2.txt", colspecs=[(0,13)])

df1

   GOKULKRISHNA
0  ABCDEFGHIJKL
1  111111111111

df2

   GOKULKRISHNA
0  ABCDEFGHIJKL
1  111111111111

现在我正在尝试在每个数据帧上生成一个哈希值,但哈希值不同。我不确定这有什么问题。有人可以对此有所了解吗?我必须确定文件中的数据是否有任何变化(不包括日期列)。

print(hash(df1.values.tostring()))
-3571422965125408226

print(hash(df2.values.tostring()))
5039867957859242153

我正在将这些文件(每个文件大小约为 2GB)加载到表中。每次我们从源接收完整文件时,有时数据都没有变化(最后一列日期除外)。所以我的想法是拒绝这样的文件。因此,如果我可以在文件上生成哈希并存储在某处(在表中),那么下次我可以将新文件哈希值与存储的哈希进行比较。所以我认为这是正确的方法。但卡住了哈希生成。

我查看了这篇文章 Most efficient property to hash for numpy array 但这不是我要找的

【问题讨论】:

  • 不同对象的哈希值会有所不同。两个数据框都不一样。试试df1.values.tostring() == df2.values.tostring(),应该是假的。如果你想拥有相同的哈希值,你需要在取哈希值之前删除值中的数据。
  • 是的,它是假的。有没有其他方法可以根据文件中的数据生成唯一代码? (不包括部分数据)
  • 您可以尝试:hash(df1[:-1].values.tostring()) 删除最后一列。
  • @TwistedSim 最后一列不在数据框中。我只加载前 13 个字符

标签: python pandas hash


【解决方案1】:

您现在可以使用pd.util.hash_pandas_object

hashlib.sha1(pd.util.hash_pandas_object(df).values).hexdigest() 

对于一个有 5000 万行的数据框,这个方法用了我 10 秒,而 to_json() 方法用了超过一分钟。

【讨论】:

    【解决方案2】:

    使用字符串表示数据框。

    import hashlib
    
    print(hashlib.sha256(df1.to_json().encode()).hexdigest())
    print(hashlib.sha256(df2.to_json().encode()).hexdigest())
    

    print(hashlib.sha256(df1.to_csv().encode()).hexdigest())
    print(hashlib.sha256(df2.to_csv().encode()).hexdigest())
    

    【讨论】:

    • 太棒了。这是有效的。但我认为大文件的哈希生成会很慢?
    • 你知道为什么在不同的运行中运行示例会给出不同的哈希值吗?你知道如何在不同的代码运行期间为相同的数据帧获取相同的哈希吗?
    猜你喜欢
    • 1970-01-01
    • 2022-11-24
    • 2016-07-16
    • 2020-11-12
    • 2019-08-01
    • 2021-12-19
    • 1970-01-01
    • 2021-09-19
    • 2021-10-24
    相关资源
    最近更新 更多