python校验和或哈希每次执行都需要相同的输出

2024-10-01 00:15:56 发布

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

尝试基于某些列为数据帧创建唯一键。使用hashlib和zlib,它们都为dataframe中相同记录的每个新python程序执行生成不同的值

正在寻找一种创建唯一校验和的方法,对于dataframe中的给定数据记录,它应该是相同的。有许多列,所以不希望将连接的列用作键。任何见解都将不胜感激。下面使用hashlib和zlib测试的示例代码

Hashlib

    stg_matchdf["Unique travelid"] = pd.DataFrame(stg_matchdf[uniquecols_list].astype(str).values.sum(axis=1))[0].\
str.encode('utf-8').apply(lambda x: (hashlib.sha512(x).hexdigest().upper()))

zlib.adler32

stg_matchdf["Unique travelid"] = pd.DataFrame(stg_matchdf[uniquecols_list].astype(str).values.sum(axis=1))[0].\
    str.encode('utf-8').apply(lambda x: (zlib.adler32(x) & 0xffffffff  ))

编辑(10/21)更改代码并遇到新问题。请复习。对不起,有什么困惑

上面的代码片段有问题。对于一行,由于pd.DataFrame()改变了原始df行顺序,在“Unique travelid”列中添加了其他行的列值哈希。下面修改的代码获取给定行的相应列值,但遇到下面解释的新问题

修改代码

stg_matchdf["Unique travelid_Sum"] = stg_matchdf[uniquecols_list].astype(str).values.sum(axis=1)
stg_matchdf["Unique travelid_Key"] = stg_matchdf["Unique travelid_Sum"].apply(lambda x: (zlib.adler32(str(x).encode('utf-8')) & 0xffffffff))

stg_matchdf[uniquecols_list].astype(str).values.sum(axis=1)未在多个运行中以特定顺序连接列。请参阅下面的两次运行示例。整个长度相同,但连接顺序是随机的。因此,它导致hashlib或zlib每次返回不同的值。有没有办法在上面的代码中指定列的顺序

Run1:
AHKGCANADACANADANORTH AMERICA266430RDirect WDAYYZINTERNATIONALMANULIFE - CANADA TRANSIENTFeb-2020HONG KONGASIA/PACIFICPARTIAL REFUND2020-02-15Canada266430.02020-02-02Hong Kong2020-03-01QVKGS6

Run2:
YYZCANADAPARTIAL REFUND2664302020-02-02AMANULIFE - CANADA TRANSIENTHONG KONGNORTH AMERICA2020-03-01Hong KongQVKGS6INTERNATIONALDirect WDRHKGACanadaFeb-2020266430.02020-02-15CANADAASIA/PACIFIC

Tags: 代码顺序listhashlibuniquevaluessumzlib