You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为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))

代码说明

  1. 先构造原始DataFrame模拟用户数据;
  2. current_max_seq记录初始最大sequence值,作为新sequence的起始递增点;
  3. 遍历每个sequence组,检查组内是否存在多个registerNumber且包含目标前缀的记录,为符合条件的registerNumber分配唯一新sequence值;
  4. 最后通过apply方法替换对应记录的sequence值,完成修正。

内容的提问来源于stack exchange,提问作者SDS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:15:37