2017-05-26 43 views
1

首次進口:散列熊貓據幀中斷

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

這個片段的多次執行產生相同的哈希值的兩倍所有的時間: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?

編輯:相關鏈接:

回答

0

根據我,當你使用字符串作爲您的單元格的值。數據幀類型是對象

df.dtypes 

表明。 這就是爲什麼你每次都得到不同的散列。

0

天真的解決方法是獲取整個數據框的字符串表示並將其散列。特別是以下任何一項都可以工作:

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

+0

[博客文章概要](http://drorata.github.io/posts/2017/May/26/when-trying-to-hash-a-data-frame/ ) – Dror