在pandas中为每一行创建唯一值?

4

获取原始数据 --> 转换并与其他文件连接 --> 通过电子邮件发送给最终用户进行审核

什么是最佳方法?

3个回答

4
如果'employee_id'+'customer_id'+'timestamp'很长,并且您对不太可能发生冲突的内容感兴趣,可以用哈希替换它。哈希的范围和质量将确定碰撞的概率。也许最简单的方法是使用内置hash。假设您的DataFrame是df,并且列是字符串,那么就是:
(df.employee_id + df.customer_id + df.timestamp).apply(hash)

如果您想更好地控制大小和碰撞概率,请参见有关Python中非加密哈希函数的文章

编辑

此问题的回答的基础上,您可以像这样构建10个字符的哈希值:

import hashlib
df['survey_id'] = (df.employee_id + df.customer_id + df.timestamp).apply(
    lambda s: hashlib.md5(s).digest().encode('base64')[: 10])

那很简单。如果我想尝试哈希库中的一些选项,有没有办法应用它们? - ldacey
1
@LanceDacey 当然,你可以用许多方法来实现,包括使用lambda函数。如果你有一些具体的问题示例,请在这里留言。 - Ami Tavory
1
@LanceDacey 1. 我认为你在这里寻找的是非加密哈希函数。加密哈希函数是极其缓慢的函数,试图使反向工程变得困难 - 这对你来说无关紧要。2. 更新了答案 - 看看它是否回答了你的问题。 - Ami Tavory
谢谢您提供额外的见解和示例!我现在已经成功实现了一个看起来正常工作的解决方案。 - ldacey
@LanceDacey 我很乐意回答你的问题,但在评论区里这样做有点困难 - 我不太明白你具体在问什么,而且你无法在评论中格式化或展示示例。也许你可以开一个新的问题?如果你在这里留言,我会很乐意看一下它(我相信其他人也会)。 - Ami Tavory
显示剩余3条评论

0

我曾经遇到过类似的问题,我是这样解决的:

import hashlib
import pandas as pd
df = pd.DataFrame.from_dict({'mine': ['yours', 'amazing', 'pajamas'], 'have': ['something', 'nothing', 'between'], 'num': [1, 2, 3]})
hashes = []
for index, row in df.iterrows():
    hashes.append(hashlib.md5(str(row).encode('utf-8')).hexdigest())
# if you want the hashes in the df, 
# in my case, I needed them to form a JSON entry per row
df['hash'] = hashes

结果将形成一个md5哈希值,但你实际上可以使用任何你需要的哈希函数。


0

如果有人正在寻找模块化的函数,请将其保存到文件中以在需要时使用。(适用于Pandas DataFrames)

df是您的数据框,columns是一个要进行哈希操作的列列表,name是具有哈希值的新列的名称。

返回原始数据框的副本,其中包含每行哈希值的新列。

def hash_cols(df, columns, name="hash"):
    new_df = df.copy()
    def func(row, cols):
        col_data = []
        for col in cols:
            col_data.append(str(row.at[col]))

        col_combined = ''.join(col_data).encode()
        hashed_col = sha256(col_combined).hexdigest()
        return hashed_col

    new_df[name] = new_df.apply(lambda row: func(row,columns), axis=1)

    return new_df

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接