如何为重复Invoice Number的交易H/D行对添加索引?技术问询
问题描述
我有一组交易数据,每条交易包含表头行(H)和明细行(D),同一交易的H行与D行的Invoice Number必须保持一致。但单日多笔交易时会出现Invoice Number重复的情况,需要给重复的Invoice Number末尾添加索引(字母或数字均可)来消除重复,想知道有没有批量处理的方法,不用逐行迭代。
原始数据
| ID | type | invoice number | amount |
|---|---|---|---|
| 01 | H | BOB12192022 | 10.00 |
| 01 | D | BOB12192022 | 10.00 |
| 02 | H | JOE12182022 | 30.00 |
| 02 | D | JOE12182022 | 30.00 |
| 03 | H | BOB12192022 | 15.00 |
| 03 | D | BOB12192022 | 15.00 |
| 04 | H | BOB12192022 | 75.00 |
| 04 | D | BOB12192022 | 25.00 |
| 04 | D | BOB12192022 | 25.00 |
| 04 | D | BOB12192022 | 25.00 |
预期结果
| ID | type | invoice number | amount |
|---|---|---|---|
| 01 | H | BOB12192022A | 10.00 |
| 01 | D | BOB12192022A | 10.00 |
| 02 | H | JOE12182022 | 30.00 |
| 02 | D | JOE12182022 | 30.00 |
| 03 | H | BOB12192022B | 15.00 |
| 03 | D | BOB12192022B | 15.00 |
| 04 | H | BOB12192022C | 75.00 |
| 04 | D | BOB12192022C | 25.00 |
| 04 | D | BOB12192022C | 25.00 |
| 04 | D | BOB12192022C | 25.00 |
批量处理方案
方法1:Python Pandas(适合大数据量)
核心逻辑:按ID分组确保同一交易的所有行共享后缀,再对重复的原始发票号按ID出现顺序生成索引,最后拼接成新发票号。
import pandas as pd # 读取数据(替换为你的数据路径,也可直接构造DataFrame) df = pd.read_csv('transaction_data.csv') # 构建发票号+ID到后缀的映射 invoice_id_map = {} for inv_num in df['invoice number'].unique(): # 提取当前发票号对应的唯一ID并排序 unique_ids = df[df['invoice number'] == inv_num]['ID'].unique().tolist() unique_ids.sort() # 分配字母后缀(A、B、C...),数字后缀用str(idx+1)即可 for idx, id_val in enumerate(unique_ids): suffix = chr(ord('A') + idx) invoice_id_map[(inv_num, id_val)] = suffix # 生成新发票号 df['new_invoice_number'] = df.apply( lambda row: row['invoice number'] + invoice_id_map.get((row['invoice number'], row['ID']), ''), axis=1 ) # 输出结果或保存 print(df[['ID', 'type', 'new_invoice_number', 'amount']]) df.to_csv('processed_transactions.csv', index=False)
方法2:Excel公式(适合无编程基础用户)
假设数据在A:D列,表头在第1行,从第2行开始是数据:
辅助列E:标记ID组的顺序
在E2单元格输入公式,下拉填充:=SUMPRODUCT(($C$2:C2=C2)*(COUNTIFS($C$2:$C$11,C2,$A$2:$A$11,$A$2:$A$11)=1))该公式会给同一发票号下的不同ID分配唯一序号(如BOB12192022的ID01对应1,ID03对应2)。
生成新发票号(G列)
在G2单元格输入公式,下拉填充:=IF(E2=1,C2,C2&CHAR(64+E2))若要使用数字后缀,替换为:
=C2&IF(E2>1,E2,"")
内容的提问来源于stack exchange,提问作者bradsdb
相关产品推荐
相关产品推荐

