基于Concepto列条件生成唯一ID的技术实现问询
基于Concepto列生成自定义唯一ID
需求规则
从Concepto列提取信息生成唯一ID,规则如下:
- 若内容包含
TARJETA ENT:提取REF:后的11位数字,加上日期部分(格式DD/MM/YYYY转为DDMMYYYY),拼接为ID - 若内容包含
AN.NOMINAL REMESA EFECTOS:提取最后一个-后的10位数字作为ID - 其他情况:提取冒号(
:)后的数字串作为ID
原始数据
| Concepto | ID |
|---|---|
| TARJETA ENT: REF:08780807807 8603CDTO. BUSINESS 1040-25/12/2021 | TARJETA ENT: REF:08780807807 8603CDTO. BUSINESS 1040-25/12/2021 |
| TARJETA ENT:-REF:08780810810 8603CDTO. BUSINESS 1040-25/12/2021 | TARJETA ENT:-REF:08780810810 8603CDTO. BUSINESS 1040-25/12/2021 |
| INTERESES DE PRESTAMO PTMO.:000087816490219968 | INTERESES DE PRESTAMO PTMO.:000087816490219968 |
| AMORTIZACION PRESTAMO PTMO.:000087816490219968 | AMORTIZACION PRESTAMO PTMO.:000087816490219968 |
| INTERESES DE LEASING LEAS.:000087816520001372 | INTERESES DE LEASING LEAS.:000087816520001372 |
| AMORTIZACION LEASING LEAS.:000087816520001372 | AMORTIZACION LEASING LEAS.:000087816520001372 |
| LEASING-COBRO DEL IVA LEAS.:000087816520001372 | LEASING-COBRO DEL IVA LEAS.:000087816520001372 |
| AN.NOMINAL REMESA EFECTOS ES8230580878030689003155-6030865924 | AN.NOMINAL REMESA EFECTOS ES8230580878030689003155-6030865924 |
| IMPORTE ORDEN PAGO CONTRATO: 000087806860000063 | IMPORTE ORDEN PAGO CONTRATO: 000087806860000063 |
期望结果
| Concepto | ID |
|---|---|
| TARJETA ENT: REF:08780807807 8603CDTO. BUSINESS 1040-25/12/2021 | 0878080780725122021 |
| TARJETA ENT:-REF:08780810810 8603CDTO. BUSINESS 1040-25/12/2021 | 0878081081025122021 |
| INTERESES DE PRESTAMO PTMO.:000087816490219968 | 000087816490219968 |
| AMORTIZACION PRESTAMO PTMO.:000087816490219968 | 000087816490219968 |
| INTERESES DE LEASING LEAS.:000087816520001372 | 000087816520001372 |
| AMORTIZACION LEASING LEAS.:000087816520001372 | 000087816520001372 |
| LEASING-COBRO DEL IVA LEAS.:000087816520001372 | 000087816520001372 |
| AN.NOMINAL REMESA EFECTOS ES8230580878030689003155-6030865924 | 6030865924 |
| IMPORTE ORDEN PAGO CONTRATO: 000087806860000063 | 000087806860000063 |
实现方案
1. Excel公式实现
在ID列的第一个单元格(如B2)输入以下公式,下拉填充即可:
=IF(ISNUMBER(SEARCH("TARJETA ENT",A2)), MID(A2,SEARCH("REF:",A2)+4,11)&SUBSTITUTE(MID(A2,SEARCH("-",A2)+1,10),"/",""), IF(ISNUMBER(SEARCH("AN.NOMINAL REMESA EFECTOS",A2)), RIGHT(A2,10), TRIM(MID(A2,SEARCH(":",A2)+1,LEN(A2))) ) )
逻辑说明:
- 第一层判断:识别
TARJETA ENT行,提取REF:后11位数字,再提取日期并去除斜杠,拼接成ID - 第二层判断:识别
AN.NOMINAL REMESA EFECTOS行,直接提取最后10位数字 - 默认情况:提取冒号后的内容并去除首尾空格
2. Python pandas批量实现
适合处理大量数据,代码示例如下:
import pandas as pd def generate_id(row): concepto = row['Concepto'] if 'TARJETA ENT' in concepto: # 提取REF后的11位数字 ref_start = concepto.find('REF:') + 4 ref_num = concepto[ref_start:ref_start+11] # 提取日期并格式化 date_start = concepto.find('-') + 1 date_str = concepto[date_start:date_start+10] date_formatted = date_str.replace('/', '') return ref_num + date_formatted elif 'AN.NOMINAL REMESA EFECTOS' in concepto: # 提取最后-后的10位数字 return concepto.split('-')[-1][:10] else: # 提取冒号后的数字串 return concepto.split(':')[-1].strip() # 构造或读取数据 df = pd.DataFrame([ {"Concepto": "TARJETA ENT: REF:08780807807 8603CDTO. BUSINESS 1040-25/12/2021", "ID": ""}, {"Concepto": "TARJETA ENT:-REF:08780810810 8603CDTO. BUSINESS 1040-25/12/2021", "ID": ""}, {"Concepto": "INTERESES DE PRESTAMO PTMO.:000087816490219968", "ID": ""}, {"Concepto": "AMORTIZACION PRESTAMO PTMO.:000087816490219968", "ID": ""}, {"Concepto": "INTERESES DE LEASING LEAS.:000087816520001372", "ID": ""}, {"Concepto": "AMORTIZACION LEASING LEAS.:000087816520001372", "ID": ""}, {"Concepto": "LEASING-COBRO DEL IVA LEAS.:000087816520001372", "ID": ""}, {"Concepto": "AN.NOMINAL REMESA EFECTOS ES8230580878030689003155-6030865924", "ID": ""}, {"Concepto": "IMPORTE ORDEN PAGO CONTRATO: 000087806860000063", "ID": ""} ]) # 生成ID列 df['ID'] = df.apply(generate_id, axis=1) # 查看结果 print(df)
逻辑说明:
- 定义
generate_id函数,按规则分支处理每行的Concepto内容 - 通过
apply函数将逻辑批量应用到DataFrame的每一行,生成ID列
内容的提问来源于stack exchange,提问作者Alejandro González Espejo
相关产品推荐
相关产品推荐

