为OC3/SO3开头的无匹配记录分配max(sequence)+1的新sequence值
问题处理方案
原始数据
原始DataFrame如下:
+-------+--------------+----+-------------+ |recType|registerNumber|mnId| sequence| +-------+--------------+----+-------------+ | 01| 13578000| 0| 1| | 11| 13578000| 1| 1| | 13| 13578000| 2| 1| | 14| 13578000| 3| 1| | 14| 13578000| 4| 1| | 01| 11121000| 5| 2| | 11| 11121000| 6| 2| | 13| 11121000| 7| 2| | 14| 11121000| 8| 2| | 01| OC387000| 9| 3| | 11| OC387000| 10| 3| | 13| OC387000| 11| 3| | 01| 11121000| 12| 4| | 11| 11121000| 13| 4| | 13| 11121000| 14| 4| | 14| 11121000| 15| 4| | 11| OC321000| 16| 4| | 13| OC321000| 17| 4| | 01| OC322000| 18| 5| | 11| OC322000| 19| 5| | 13| OC322000| 20| 5| | 11| SO352000| 21| 5| | 13| SO352000| 22| 5| +-------+--------------+----+-------------+
问题核心:部分sequence组中包含多个registerNumber,其中以OC3或SO3开头的记录未以recType=01起始,被错误归到上一个记录集。需要将这些记录独立出来,分配新的sequence值(取值为当前最大sequence+1),且同一registerNumber的所有记录共享同一个新值。
期望结果
处理后的DataFrame如下:
+-------+--------------+----+-------------+ |recType|registerNumber|mnId| sequence| +-------+--------------+----+-------------+ | 01| 13578000| 0| 1| | 11| 13578000| 1| 1| | 13| 13578000| 2| 1| | 14| 13578000| 3| 1| | 14| 13578000| 4| 1| | 01| 11121000| 5| 2| | 11| 11121000| 6| 2| | 13| 11121000| 7| 2| | 14| 11121000| 8| 2| | 01| OC387000| 9| 3| | 11| OC387000| 10| 3| | 13| OC387000| 11| 3| | 01| 11121000| 12| 4| | 11| 11121000| 13| 4| | 13| 11121000| 14| 4| | 14| 11121000| 15| 4| | 11| OC321000| 16| 6| | 13| OC321000| 17| 6| | 01| OC322000| 18| 5| | 11| OC322000| 19| 5| | 13| OC322000| 20| 5| | 11| SO352000| 21| 7| | 13| SO352000| 22| 7| +-------+--------------+----+-------------+
实现代码
使用Pandas完成处理,代码如下:
import pandas as pd # 构造原始DataFrame data = [ ["01", "13578000", 0, 1], ["11", "13578000", 1, 1], ["13", "13578000", 2, 1], ["14", "13578000", 3, 1], ["14", "13578000", 4, 1], ["01", "11121000", 5, 2], ["11", "11121000", 6, 2], ["13", "11121000", 7, 2], ["14", "11121000", 8, 2], ["01", "OC387000", 9, 3], ["11", "OC387000", 10, 3], ["13", "OC387000", 11, 3], ["01", "11121000", 12, 4], ["11", "11121000", 13, 4], ["13", "11121000", 14, 4], ["14", "11121000", 15, 4], ["11", "OC321000", 16, 4], ["13", "OC321000", 17, 4], ["01", "OC322000", 18, 5], ["11", "OC322000", 19, 5], ["13", "OC322000", 20, 5], ["11", "SO352000", 21, 5], ["13", "SO352000", 22, 5], ] df = pd.DataFrame(data, columns=["recType", "registerNumber", "mnId", "sequence"]) # 获取初始最大sequence值 current_max_seq = df["sequence"].max() # 存储目标registerNumber对应的新sequence值 new_seq_map = {} # 遍历每个sequence组,筛选需要分配新sequence的记录 for seq, group in df.groupby("sequence"): unique_regs = group["registerNumber"].unique() if len(unique_regs) > 1: # 筛选OC3/SO3开头的registerNumber target_regs = [reg for reg in unique_regs if reg.startswith(("OC3", "SO3"))] for reg in target_regs: if reg not in new_seq_map: current_max_seq += 1 new_seq_map[reg] = current_max_seq # 更新sequence列 df["sequence"] = df.apply( lambda row: new_seq_map.get(row["registerNumber"], row["sequence"]), axis=1 ) # 输出结果 print(df.to_string(index=False))
代码说明
- 先构造原始DataFrame模拟用户数据;
current_max_seq记录初始最大sequence值,作为新sequence的起始递增点;- 遍历每个sequence组,检查组内是否存在多个registerNumber且包含目标前缀的记录,为符合条件的registerNumber分配唯一新sequence值;
- 最后通过
apply方法替换对应记录的sequence值,完成修正。
内容的提问来源于stack exchange,提问作者SDS
相关产品推荐
相关产品推荐

