Python按列B分组生成ID及跨执行续接ID的实现方案咨询
问题1:为Column B分组生成唯一ID列
要实现对Column B的每个唯一分组生成带固定前缀ID_的两位数字ID,可借助pandas的factorize方法为每个唯一值分配递增整数标识,再格式化字符串即可:
import pandas as pd # 构造示例数据 data = { 'Column A': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B'], 'Column B': ['123', '123', '123', '456', '456', '988', '988', '233', '233', '654', '654', '654'] } df = pd.DataFrame(data) # 生成ID列:对Column B的唯一分组分配从1开始的递增ID,格式为ID_XX df['ID'] = 'ID_' + (pd.factorize(df['Column B'])[0] + 1).astype(str).str.zfill(2) print(df)
执行后每个Column B的相同值对应同一个ID,不同值按出现顺序生成递增ID,与预期输出一致。
问题2:下次执行从上次最后ID继续生成
要实现跨执行会话的ID连续性,需将上次生成的最大ID值持久化存储(比如文本文件),下次启动时读取该值作为起始点:
核心步骤:
- 读取本地存储的上次最大ID(文件不存在则默认从1开始)
- 对新数据的Column B去重,为每个唯一值分配从起始ID开始的递增ID
- 更新本地存储的最大ID为本次生成的最后一个ID
代码实现:
import pandas as pd def load_last_id(file_path='last_id.txt'): """读取上次保存的最大ID数值""" try: with open(file_path, 'r') as f: return int(f.read().strip()) except FileNotFoundError: return 1 # 首次执行默认从1开始 def save_last_id(last_id, file_path='last_id.txt'): """保存本次生成的最大ID数值""" with open(file_path, 'w') as f: f.write(str(last_id)) # 新数据示例 new_data = { 'Column A': ['C', 'C', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D'], 'Column B': ['567', '567', '567', '098', '098', '200', '111', '123', '123', '450'] } df_new = pd.DataFrame(new_data) # 获取上次最后ID作为起始点 start_id = load_last_id() # 为新数据的Column B唯一值创建ID映射 unique_b_values = df_new['Column B'].unique() id_mapping = { b_val: f'ID_{(start_id + idx):02d}' for idx, b_val in enumerate(unique_b_values) } # 映射生成ID列 df_new['ID'] = df_new['Column B'].map(id_mapping) # 计算并保存本次的最大ID current_max_id = start_id + len(unique_b_values) save_last_id(current_max_id) print(df_new)
注意事项:
- 如果涉及并发操作,建议改用数据库存储或加锁机制避免ID冲突
- 存储文件路径可根据实际需求调整
内容的提问来源于stack exchange,提问作者Nithya
相关产品推荐
相关产品推荐

