首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
DataFrame列结构化编号提取与智能映射新列方法

DataFrame列结构化编号提取与智能映射新列方法

热心网友
17
转载
2026-05-06

如何从 DataFrame 列中提取结构化编号并智能映射到新列

本文介绍使用正则表达式与上下文记忆机制,从非规范化的 section_name 中精准提取 section_id,并对无编号条目(如 “synopsis”)实现基于历史匹配的智能回填。

如何从 DataFrame 列中提取结构化编号并智能映射到新列

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

处理文档结构化数据时,你是否也常遇到这样的麻烦?测试用例、章节大纲或是SOP条款的 section_name 列里,文本格式五花八门:既有带着清晰编号的“1.3.1.Test Period I - Screening13”,也夹杂着只有纯标题的“Synopsis”,中间还可能点缀着空值和空白行。我们的目标很明确:生成一列语义一致的 section_id。对于带编号的条目,提取出前缀如“1.3.1”;对于纯标题,则要聪明地找到它所属的最近有效编号。这可不是简单的字符串切割,它要求算法同时具备精准的模式识别能力理解上下文关联的能力

核心思路:正则提取 + 历史映射表

一个直观但容易出错的思路是逐行传递状态。这里推荐更稳健的方法:构建一个动态字典,我们称之为 prev_ids。它的妙处在于,每当处理一个“编号+标题”组合时,我们就把剥离编号后的纯标题部分作为键(key),把对应的编号作为值(value)存起来。这样一来,后续遇到任何纯标题,只需要在这个“历史记忆库”里快速查找匹配项,就能回溯到它的归属编号,逻辑清晰且不易出错。

✅ 正确实现(推荐)

import pandas as pd
import numpy as np
import re

# 示例数据(含空值、None、空白字符串)
data = {
    'section_name': [
        '1.Test Summary9',
        '1.1.Synopsis9',
        '1.2.Schema12',
        '1.3.1.Test Period  I - Screening13',
        '1.3.2.Period II - obes-Treatment 15',
        'Synopsis',
        'Test Period  I - Screening',
        None,
        ''
    ]
}
df = pd.DataFrame(data)

def extract_section_id(row, id_map):
    name = row['section_name']
    # 跳过 None、NaN、空字符串或纯空白
    if pd.isna(name) or str(name).strip() == '':
        return ''  # 或返回 np.nan,按需选择
    name_str = str(name).strip()

    # 正则匹配:捕获连续的数字+点号组合(支持 1、1.1、1.3.1 等)
    match = re.match(r'^(\d+(?:\.\d+)*)\.(.*)$', name_str)
    if match:
        sec_id, title_part = match.groups()
        # 将标题部分(去空格)作为 key,映射到当前编号
        id_map[title_part.strip()] = sec_id
        return sec_id
    else:
        # 非编号格式:尝试在历史标题中查找是否为子串(如 "Synopsis" in "1.1.Synopsis9" → True)
        for full_title, sec_id in id_map.items():
            if name_str in full_title or full_title in name_str:
                return sec_id
        return ''  # 未匹配到,返回空(或 np.nan)

# 初始化映射字典
id_mapping = {}
df['section_id'] = df.apply(lambda r: extract_section_id(r, id_mapping), axis=1)

关键细节说明:

  • 正则 r'^(\d+(?:\.\d+)*)\.(.*)$'
    开头的 ^ 和结尾的 $ 确保了匹配从行首开始、到行尾结束,避免误匹配中间部分。(\d+(?:\.\d+)*) 这个分组负责捕获多级编号,无论是“1”、“1.1”还是“1.3.1”都能搞定。紧接着的 \. 匹配那个作为分隔符的字面量点号,最后的 (.*) 则把剩下的所有标题内容都捕获进来。
  • 智能回填逻辑
    这里没有使用严格的相等判断,而是采用了子串匹配(name_str in full_title)。这非常实用,它使得“Synopsis”能成功匹配到“1.1.Synopsis9”,“Test Period I - Screening”也能对应上“1.3.1.Test Period I - Screening13”,容错性更强。
  • 空值处理统一
    对于 None、np.nan 以及空字符串,函数统一返回空字符串。当然,根据后续分析需求,你也可以选择统一返回 np.nan 以保持数据类型的整洁。

⚠️ 注意事项:

  • 歧义匹配:如果存在模糊情况,比如“A”这个标题既出现在“1.A”里,也出现在“2.AB”中,当前的逻辑会返回最先注册的那个编号(sec_id)。如果需要更精确的全词匹配,可以考虑改用 re.search(rf'\b{name_str}\b', full_title) 来增强判断。
  • 数据顺序假设:这个方法默认数据的顺序是有业务意义的,即带编号的条目会先于其对应的纯标题出现。如果原始数据顺序混乱,务必先按业务逻辑(比如原始索引或某个辅助序号)进行排序预处理。
  • 性能提示:当面对超大规模数据集(行数超过10万)时,为了提升效率,可以预编译正则表达式对象,并优先使用 pandas 的向量化操作(如 df['section_name'].str.extract())来批量处理所有带编号的行。完成后再用 map() 方法来回填纯标题行,这样速度会快得多。

运行上述代码后,得到的 DataFrame 输出如下,可以看到智能映射的效果:

                        section_name section_id
0                      1.Test Summary9          1
1                        1.1.Synopsis9        1.1
2                         1.2.Schema12        1.2
3   1.3.1.Test Period  I - Screening13      1.3.1
4  1.3.2.Period II - obes-Treatment 15      1.3.2
5                             Synopsis        1.1
6           Test Period  I - Screening      1.3.1
7                               None            
8                                     

总的来说,这个方案鲁棒性强,逻辑清晰,能够很好地应对真实业务场景中常见的半结构化文本解析挑战。

来源:https://www.php.cn/faq/2325363.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

鸣潮3.3版本声骸管理方案推荐 3.3版本声骸管理有没有方案码
游戏攻略
鸣潮3.3版本声骸管理方案推荐 3.3版本声骸管理有没有方案码

鸣潮3 3版本声骸管理方案推荐 随着鸣潮3 3版本的到来,一次全面的声骸系统更新在所难免。特别是针对那些拥有特殊机制的角色,如何高效管理你的声骸库存,成了不少指挥官当前的头等大事。好消息是,新版本支持通过方案码一键导入配置,这无疑大大提升了效率。那么,当前版本有哪些值得关注的方案,又该如何灵活运用呢

热心网友
05.06
鸣潮3.3版本卡池抽取建议 3.3版本卡池值得抽吗
游戏攻略
鸣潮3.3版本卡池抽取建议 3.3版本卡池值得抽吗

鸣潮3 3版本卡池抽取建议:值得抽吗? 各位漂泊者,3 3版本卡池已经正式上线。这次的主角,无疑是那位能大幅提升冰队战力的新角色——绯雪。作为一位霜渐主C,她的加入无疑为战场带来了更多可能性。很多玩家都在纠结,这个版本的卡池究竟该如何规划?今天,我们就来深入聊聊3 3版本的抽卡策略。 先说结论(省流

热心网友
05.06
归环影狩流玩法是什么
游戏攻略
归环影狩流玩法是什么

归环影狩流:在策略与对抗中体验极致乐趣 归环影狩流,这个玩法名字本身就透着一股独特的吸引力。它融合了紧张刺激的对抗与深度策略思考,让无数玩家沉浸其中,欲罢不能。在这里,你收获的不仅是胜利的快感,更是一场关于时机、节奏与团队协作的智慧较量。 归环影狩流核心玩法攻略 想要玩转归环影狩流,首先得吃透它的规

热心网友
05.06
超时空观测站--“支援技能“调整来了
游戏攻略
超时空观测站--“支援技能“调整来了

《奥特曼:超时空英雄》超时空观测站--“支援技能“调整来了 各位指挥官,注意了!《奥特曼:超时空英雄》的核心战术模块——支援技能,迎来了一轮关键性调整。这可不是简单的数值微调,而是直接关系到阵容搭配、出手顺序乃至战场胜负格局的改动。下面,就让我们结合最新的实战演示,来逐一拆解这些变化。 通过上方视频

热心网友
05.06
每周福利丨假期仅剩两天啦!先来领个福利压压惊
游戏攻略
每周福利丨假期仅剩两天啦!先来领个福利压压惊

各位天命人周一好呀,又要开启新一周的修行征途啦! 请收下这份周一的馈赠,助您修行之路畅通无阻~ ​ ✨福利兑换码 ZHOUYI3752 ✨内含物品 天命灵果*2,修炼丹·2小时*1 ✨有效期 即日起~2026年5月10日 ✨兑换方式 【进入游戏主界面】-【点击”福利”图标】-【点击下”福利兑换”图标

热心网友
05.06

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

POE交换机连接设备后频繁重启原因解析
电脑教程
POE交换机连接设备后频繁重启原因解析

Poe交换机带载后重启:是故障,还是系统在“自救”? 不少朋友遇到过这个头疼的问题:PoE交换机一接上设备就重启。其实,这本质上不是设备坏了,而是供电系统一套精密的自我保护机制在起作用。当负载接入的瞬间,如果系统检测到功耗超标、供电不稳等情况,就会主动触发复位,防止硬件受损。这正是IEEE 802

热心网友
05.06
电饼铛选购指南哪款型号性价比最高
电脑教程
电饼铛选购指南哪款型号性价比最高

高性价比电饼铛:精准匹配、扎实可靠、真正省心 挑选一款高性价比的电饼铛,核心其实很明确:功能要精准匹配你的真实需求,材质工艺必须扎实可靠,细节设计能让你每天用着都省心。它追求的绝不是单纯的便宜或者参数漂亮,而是每一分钱都花在刀刃上。比如,2100W级的稳定火力保证了煎烤效率不打折;0氟不粘涂层配合蜂

热心网友
05.06
红米K30 5G动态壁纸不联网可以使用吗
电脑教程
红米K30 5G动态壁纸不联网可以使用吗

红米K30 5G动态壁纸联网机制全解析 关于红米K30 5G的动态壁纸是否需要一直联网,答案是:完全没必要。这玩意儿用起来其实很“懂事”,它只在你第一次上手和偶尔想换新的时候,才需要网络搭把手。 其背后的逻辑很清晰:手机搭载的MIUI系统,把所有酷炫的动态壁纸资源都放在了小米官方的“云端仓库”里。所

热心网友
05.06
vivo Y35手机桌面时间不显示修复方法
电脑教程
vivo Y35手机桌面时间不显示修复方法

vivo Y35桌面时间不显示?别急,这事儿有解 不少vivo Y35用户可能都遇到过这个情况:一觉醒来,或者换个主题之后,主屏幕上那个熟悉的“时间”不见了。先别急着怀疑手机坏了,事实是,超过八成的类似问题,根源其实很简单——时间组件压根没被“请”上桌面,或者相关的自动设置被无意中关闭了。作为一台搭

热心网友
05.06
英雄联盟手游杰斯新皮肤获取方法与实战评测
游戏攻略
英雄联盟手游杰斯新皮肤获取方法与实战评测

英雄联盟手游杰斯新皮肤外观设计酷炫,充满科技感。技能特效以蓝色能量为主,视觉效果震撼且辨识度高。实战中技能清晰、手感流畅,能提升操作自信与战场表现。整体而言,该皮肤在视觉、特效与实战体验上均表现优异,值得玩家入手。

热心网友
05.06