如何在Python Jupyter Notebook中拆分全名为名、中间名、姓?
姓名拆分解决方案(含特殊姓氏处理)
基础情况处理(2段/3段姓名)
你的初始代码用str.split(' ',n=2,expand=True)的问题是,当姓名只有2段时,Middle Name会出现空值,只需补充空值替换逻辑就能得到期望输出:
import pandas as pd df = pd.read_excel("Sample.xlsx") # 按空格拆分,最多拆为3列 split_cols = df['Full Name'].str.split(' ', n=2, expand=True) split_cols.columns = ['First Name', 'Middle Name', 'Last Name'] # 将空值统一替换为N/A split_cols = split_cols.fillna('N/A') # 合并到原数据框 df = pd.concat([df, split_cols], axis=1)
特殊姓氏场景处理(带连字符/多词姓氏)
针对Rani Amol Sharma-Warma(带连字符姓氏)或Disha Sharma Warma(多词无中间名)这类情况,需要自定义逻辑区分中间名和姓氏,以下是两种实用思路:
思路1:优先识别带连字符的姓氏
如果姓氏包含连字符,直接将最后一个带连字符的词作为姓氏,剩余部分按常规拆分:
def split_name(name): parts = name.split() if len(parts) == 1: return (parts[0], 'N/A', 'N/A') elif len(parts) == 2: return (parts[0], 'N/A', parts[1]) else: # 检查最后一段是否含连字符 if '-' in parts[-1]: first = parts[0] middle = ' '.join(parts[1:-1]) if len(parts[1:-1]) > 0 else 'N/A' last = parts[-1] else: # 无连字符时,默认将最后多段合并为姓氏(可根据实际需求调整) first = parts[0] middle = 'N/A' last = ' '.join(parts[1:]) return (first, middle, last) # 应用拆分函数到全名列 df[['First Name', 'Middle Name', 'Last Name']] = df['Full Name'].apply( lambda x: pd.Series(split_name(x)) )
测试效果:
Rani Amol Sharma-Warma→('Rani', 'Amol', 'Sharma-Warma')Disha Sharma Warma→('Disha', 'N/A', 'Sharma Warma')Kumar Krishnan Menon→('Kumar', 'Krishnan', 'Menon')
思路2:自定义姓氏白名单(精准匹配)
如果数据中有固定的多词姓氏,可维护白名单实现精准拆分:
# 示例姓氏白名单,根据实际场景扩展 LAST_NAME_WHITELIST = {'Sharma Warma', 'Smith Jones'} def split_name_with_whitelist(name): parts = name.split() if len(parts) == 1: return (parts[0], 'N/A', 'N/A') # 从后往前匹配白名单中的姓氏 for i in range(len(parts)-1, 0, -1): candidate_last = ' '.join(parts[i:]) if candidate_last in LAST_NAME_WHITELIST: first = parts[0] middle = ' '.join(parts[1:i]) if i > 1 else 'N/A' last = candidate_last return (first, middle, last) # 无匹配时按常规规则拆分 if len(parts) == 2: return (parts[0], 'N/A', parts[1]) else: return (parts[0], ' '.join(parts[1:-1]), parts[-1]) # 应用拆分函数 df[['First Name', 'Middle Name', 'Last Name']] = df['Full Name'].apply( lambda x: pd.Series(split_name_with_whitelist(x)) )
内容的提问来源于stack exchange,提问作者vishakha abnave
相关产品推荐
相关产品推荐

