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

时间:2016-03-09 17:36:42

标签: python pandas

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

最好的方法是什么?

2 个答案:

答案 0 :(得分:3)

如果'employee_id'+'customer_id'+'timestamp'很长,并且您对不太可能发生冲突感兴趣,可以将其替换为哈希值。散列的范围和质量将决定冲突的概率。也许最简单的方法是使用builtin hash。假设您的DataFrame为df,且列为字符串,则为

(df.employee_id + df.customer_id + df.timestamp).apply(hash)

如果您想更好地控制大小和碰撞概率,请参阅this piece on non-crypotgraphic hash functions in Python

修改

an answer to this question上构建,你可以像这样构建10个字符的哈希:

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

答案 1 :(得分:0)

如果有人正在寻找模块化功能,请将其保存到文件中以备不时之需。 (对于 Pandas 数据帧)

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