elasticsearch,Python,elasticsearch" /> elasticsearch,Python,elasticsearch" />

Python 基于Pandas数据帧n列的唯一UUID(用于在ElasticSearch上处理重复项)

Python 基于Pandas数据帧n列的唯一UUID(用于在ElasticSearch上处理重复项),python,elasticsearch,Python,elasticsearch,我正在创建一个函数来根据其他列的值设置UUID列。我想要的是在将数据帧索引到Elasticsearch时处理重复。基于多个列的值,UUID应该始终相同 我的输出有问题,为每行生成相同的UUID 数据帧 cols = ['col1', 'col2'] data = {'col1': ['Mike','Robert','Sandy'], 'col2': ['100','200','300']} col1 col2 0 Mike 100

我正在创建一个函数来根据其他列的值设置UUID列。我想要的是在将数据帧索引到Elasticsearch时处理重复。基于多个列的值,UUID应该始终相同

我的输出有问题,为每行生成相同的UUID

数据帧

cols = ['col1', 'col2']
data = {'col1': ['Mike','Robert','Sandy'],
        'col2': ['100','200','300']}


        col1 col2  
    0    Mike  100 
    1  Robert  200 
    2   Sandy  300
功能

def create_uuid_on_n_col (df):
    # concat column string values 
    concat_col_str_id = df.apply(lambda x: uuid.uuid5(uuid.NAMESPACE_DNS,'_'.join(map(str, x))), axis=1)
    return concat_col_str_id[0]
输出

df['id'] = create_uuid_2_col(df[['col1','col2']])

     col1 col2                                    id
0    Mike  100  a17ad043-486f-5eeb-8138-8fa2b10659fd
1  Robert  200  a17ad043-486f-5eeb-8138-8fa2b10659fd
2   Sandy  300  a17ad043-486f-5eeb-8138-8fa2b10659fd

不需要定义另一个助手函数。我们还可以矢量化列的连接,如下所示

from functools import partial

p = partial(uuid.uuid5, uuid.NAMESPACE_DNS)

df.assign(id=(df.col1 + '_' + df.col2).apply(p))

     col1  col2                                    id
0    Mike   100  a17ad043-486f-5eeb-8138-8fa2b10659fd
1  Robert   200  e520efd5-157a-57ee-84fb-41b9872af407
2   Sandy   300  11208b7c-b99b-5085-ad98-495004e6b043
def create_uuid_on_n_col(df):
    temp = df.agg('_'.join, axis=1)
    return df.assign(id=temp.apply(custom_uuid))

create_uuid_on_n_col(df[['col1','col2']])

     col1 col2                                    id
0    Mike  100  a17ad043-486f-5eeb-8138-8fa2b10659fd
1  Robert  200  e520efd5-157a-57ee-84fb-41b9872af407
2   Sandy  300  11208b7c-b99b-5085-ad98-495004e6b043
如果不想导入分部,请定义一个函数

def custom_uuid(data):
    val = uuid.uuid5(uuid.NAMESPACE_DNS, data)
    return val

df.assign(id=(df.col1 + '_' + df.col2).apply(custom_uuid))
使用原始函数,如下所示

from functools import partial

p = partial(uuid.uuid5, uuid.NAMESPACE_DNS)

df.assign(id=(df.col1 + '_' + df.col2).apply(p))

     col1  col2                                    id
0    Mike   100  a17ad043-486f-5eeb-8138-8fa2b10659fd
1  Robert   200  e520efd5-157a-57ee-84fb-41b9872af407
2   Sandy   300  11208b7c-b99b-5085-ad98-495004e6b043
def create_uuid_on_n_col(df):
    temp = df.agg('_'.join, axis=1)
    return df.assign(id=temp.apply(custom_uuid))

create_uuid_on_n_col(df[['col1','col2']])

     col1 col2                                    id
0    Mike  100  a17ad043-486f-5eeb-8138-8fa2b10659fd
1  Robert  200  e520efd5-157a-57ee-84fb-41b9872af407
2   Sandy  300  11208b7c-b99b-5085-ad98-495004e6b043

非常感谢@gold\u cy,有没有其他解决方案不导入部分内容?