如何在 Python Dataframe(从固定宽度文件创建)上生成哈希或校验和值?

gok*_*oks 8 python hash pandas

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

sample_hash1.txt

GOKULKRISHNA 04/17/2018
ABCDEFGHIJKL 04/17/2018
111111111111 04/17/2018
Run Code Online (Sandbox Code Playgroud)

sample_hash2.txt

GOKULKRISHNA 04/16/2018
ABCDEFGHIJKL 04/16/2018
111111111111 04/16/2018
Run Code Online (Sandbox Code Playgroud)

使用 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)])
Run Code Online (Sandbox Code Playgroud)

df1

   GOKULKRISHNA
0  ABCDEFGHIJKL
1  111111111111
Run Code Online (Sandbox Code Playgroud)

df2

   GOKULKRISHNA
0  ABCDEFGHIJKL
1  111111111111
Run Code Online (Sandbox Code Playgroud)

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

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

print(hash(df2.values.tostring()))
5039867957859242153
Run Code Online (Sandbox Code Playgroud)

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

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

Rok*_*jic 6

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

hashlib.sha1(pd.util.hash_pandas_object(df).values).hexdigest() 
Run Code Online (Sandbox Code Playgroud)

对于具有 5000 万行的数据帧,此方法花费了我 10 秒,而 to_json() 方法花费了超过一分钟。


pyt*_*ter 5

使用字符串表示数据框。

import hashlib

print(hashlib.sha256(df1.to_json().encode()).hexdigest())
print(hashlib.sha256(df2.to_json().encode()).hexdigest())
Run Code Online (Sandbox Code Playgroud)

或者

print(hashlib.sha256(df1.to_csv().encode()).hexdigest())
print(hashlib.sha256(df2.to_csv().encode()).hexdigest())
Run Code Online (Sandbox Code Playgroud)

  • 惊人的。这是有效的。但我认为大文件的哈希生成会很慢? (5认同)