2017-05-26 4 views
1

Ersteinfuhr:Hashing Pandas Datenrahmen bricht

import pandas as pd 
import numpy as np 
import hashlib 

Als nächstes sollten Sie Folgendes berücksichtigen:

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()) 

Mehrere Ausführungen dieses Schnipsel liefern den gleichen Hash zweimal die ganze Zeit: ddfee4572d380bef86d3ebe3cb7bfa7c68b7744f55f67f4e1ca5f6872c2c9ba1.

Wenn wir jedoch die folgenden Punkte beachten:

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()) 

Hinweis, dass es Strings in den Daten jetzt. Der Hash der arr ist fest (52db9328682317c44370b8186a5c6bae75f2a94c9d0d5b24d61f602857acd3de) für verschiedene Auswertungen, aber der eine der pandas.DataFrame ändert sich jedes Mal.

Irgendein pythonischer Weg um ihn herum? Kein Python?

Edit: Links zum Thema:

Antwort

0

mir nach, wenn Sie Zeichenfolge als Wert für Ihre Zellen verwenden. Datenrahmentyp ist Objekt

df.dtypes 

zeigt, dass. Deshalb erhalten Sie jedes Mal einen anderen Hashwert.

0

Naive Workaround ist es, eine String-Darstellung des gesamten Datenrahmens zu erhalten und hash es. Insbesondere kann einer der folgenden Schritte funktionieren:

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

Natürlich wird dies für große Datenrahmen sehr lang sein.

Dennoch bleibt das pd.DataFrame(arr).values != arr, und das ist kontraintuitiv.

Eine Zusammenfassung: https://gist.github.com/drorata/bfc5d956c4fb928dcc77510a33009691

+0

[Blog post Zusammenfassung] (http://drorata.github.io/posts/2017/May/26/when-trying-to-hash-a-data-frame/) – Dror