如何使用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
相关产品推荐
相关产品推荐

