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

如何使用Python将单列人员信息DataFrame重构为多列结构化表

实现方案

核心思路是先按空行拆分不同人员的信息块,再对每个信息块做字段匹配提取,最终转换为结构化表。

完整可运行代码

import pandas as pd
import re
import numpy as np

# --------------- 替换为你自己的原始DataFrame即可 ---------------
# 示例输入:仅包含description列的DataFrame
raw_df = pd.DataFrame({
    'description': [
        '姓名:张三',
        '门牌号:XX小区3栋201室',
        '职位:产品经理',
        '电话:13800138000',
        '邮箱:zhangsan@example.com',
        '',  # 空行分隔不同人员
        '姓名:李四',
        '职位:后端开发工程师',
        '邮箱:lisi@example.com',
        '',  # 空行分隔不同人员
        '姓名:王五',
        '门牌号:YY花园1栋1002室',
        '电话:13900139000',
    ]
})

# -------------------- 第一步:按空行分组 --------------------
# 标记空行位置,生成人员分组ID,若空行含空格可把eq('')改为str.strip().eq('')
raw_df['group_id'] = raw_df['description'].eq('').cumsum()
# 过滤掉空行,按组聚合单个人员的所有信息行
person_groups = raw_df[raw_df['description'].ne('')].groupby('group_id')['description'].apply(list).tolist()

# -------------------- 第二步:定义字段匹配规则 --------------------
# 正则规则可根据你实际的文本格式调整,无匹配的字段默认填充NaN
def parse_person(lines):
    res = {
        'name': np.nan,
        'address': np.nan,
        'designation': np.nan,
        'telephone': np.nan,
        'email': np.nan
    }
    for line in lines:
        # 匹配姓名,若无前缀可调整为纯汉字匹配规则:r'^[\u4e00-\u9fa5]{2,4}$'
        name = re.search(r'(?:姓名|名字)[::]\s*(.+)', line)
        if name:
            res['name'] = name.group(1).strip()
            continue
        # 匹配地址/门牌号
        addr = re.search(r'(?:门牌号|地址)[::]\s*(.+)', line)
        if addr:
            res['address'] = addr.group(1).strip()
            continue
        # 匹配职位
        desig = re.search(r'(?:职位|岗位)[::]\s*(.+)', line)
        if desig:
            res['designation'] = desig.group(1).strip()
            continue
        # 匹配手机号/固定电话
        tel = re.search(r'(?:电话|手机|联系电话)[::]\s*([1]\d{10}|\d{3,4}-\d{7,8})', line)
        if tel:
            res['telephone'] = tel.group(1).strip()
            continue
        # 匹配邮箱
        email = re.search(r'(?:邮箱|email)[::]\s*([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})', line, re.I)
        if email:
            res['email'] = email.group(1).strip()
            continue
    return res

# -------------------- 第三步:生成结构化表 --------------------
parsed_list = [parse_person(group) for group in person_groups]
result_df = pd.DataFrame(parsed_list)

# 输出查看结果
print(result_df)

调整说明

如果你的原始文本没有「姓名:」「电话:」这类固定前缀,修改parse_person函数里对应字段的正则即可,直接匹配字段本身的特征:

  • 姓名可匹配2-4个纯汉字的行
  • 地址可匹配含「小区、栋、室、号、弄」等关键字的行
  • 电话直接匹配手机号/固定电话格式即可
  • 邮箱直接匹配含@的合法邮箱格式即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:36:06