Pandas指数摘要

2024-03-29 11:43:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想高效地计算一个熊猫数据帧的摘要,它唯一地、可重复地标识它的内容(出于版本控制的目的)。假设现在我不担心endianness、数据类型、索引类型或列。还假设索引和列都已按单调递增的顺序排序。你知道吗

事情与这些值相当吻合(同样,为了简化,假设np.float64)。但是我在索引(和列)方面遇到了问题,没有得到一致的摘要。当然,我可以做一些事情,比如将索引转换成字符串,然后再转换成utf-8字节,但是这很慢。你知道吗

下面是一个简化的示例:

import hashlib
def pd_val_sha1(df):
    x = df.values
    if not x.flags.c_contiguous:
        x = x.copy(order='C')
    return hashlib.sha1(x).hexdigest()

测试:

import pandas as pd
import io

str = """s,e,id,x,y,z
2012-01-01,2013-01-01,b,NaN,2,3
2015-10-27,2015-11-03,a,0.04,12.7,NaN
2015-11-15,2016-01-01,a,7.3,-1.2,8
"""
df = pd.read_csv(io.StringIO(str), parse_dates=[0,1], index_col=[0,1,2]).sort_index()
df

输出:

                            x     y    z
s          e          id                 
2012-01-01 2013-01-01 b    NaN   2.0  3.0
2015-10-27 2015-11-03 a   0.04  12.7  NaN
2015-11-15 2016-01-01 a   7.30  -1.2  8.0

值的SHA-1:

pd_val_sha1(df)
>>> 'a7f0335988a967606bd030864e0e30ce03f32ec9'

pd_val_sha1(df.head())
>>> 'a7f0335988a967606bd030864e0e30ce03f32ec9'

pd_val_sha1(pd.concat([df.ix[0:2], df.ix[2:3]]))
>>> 'a7f0335988a967606bd030864e0e30ce03f32ec9'

到目前为止,还不错。但说到指数:

pd_val_sha1(df.index)
>>> inconsistent value (re-run the example from read_csv and we'll get
... a different result).

我尝试了其他各种方法,例如用index.dataindex.to_native_types()np.array(index.tolist())代替index.values,但是我仍然得到了不一致的结果,因为我认为基础数据可能会有所不同。你知道吗

到目前为止,有一件事似乎是可行的hashlib.sha1(np.array(df.index.format())).hexdigest()。但是它的速度很慢,例如对于一个(5000000,12)数据帧来说是2分钟34秒,而内容本身是900毫秒的指纹

有什么建议吗?你知道吗


Tags: 数据import内容dfindexnpvalnan
1条回答
网友
1楼 · 发布于 2024-03-29 11:43:59

有时解决办法就在我们眼皮底下。。。你知道吗

from sklearn.externals import joblib

%%time
joblib.hash(df, hash_name='sha1')
>>> consistent value that depends on values and axes
Wall time: 1.66 s  (for the (5000000,12) DataFrame mentioned above) 

相关问题 更多 >