Python如何不转换DataFrame直接修改列表内姓名格式
Python列表内姓名字段格式转换方案
需求说明
需要直接对列表存储的姓名做格式转换,全程保持list类型,无需转换为DataFrame:
- 原格式:Last, First [中间名/前后缀](姓在前,逗号分隔,后面跟名和可选的中间名、缩写、前后缀)
- 目标格式:First Last(名在前,姓在后,丢弃所有中间名、姓名前后缀)
测试数据
输入列表
current_list = ["Sanchez, Rick", "Rick, Killer", "Smith, Morty S O L", "Smith, Summer J", "Clockberg Jr., Revolio", "van Womg, Peter", "Lynn-Marie, Sam", "Parker II, Peter"]
期望输出
transformed_list = ["Rick Sanchez", "Killer Rick", "Morty Smith", "Summer Smith", "Revolio Clockberg", "Peter Womg", "Sam Lynn-Marie", "Peter Parker"]
实现逻辑
列表类型没有pandas Series的apply方法,直接用for循环/列表推导式逐元素处理即可,性能比转DataFrame更高,也无需依赖pandas库。
注意直接对全字符串按空格拆分的写法无法正确处理带空格的复姓、带前后缀的姓名,因此需要先按第一个逗号拆分姓段和名段,再分别清洗:
- 名段处理:取逗号后第一个空格前的内容作为正式名,后面所有中间名、缩写直接丢弃
- 姓段处理:过滤掉所有无效段,包括带点的世代后缀(Jr.、Sr.等)、全大写的短串(罗马数字II/III、单个首字母缩写等)、全小写开头的姓名前缀(van、der等),剩下的内容就是核心姓氏
完整代码
def is_valid_last_segment(seg: str) -> bool: """判断姓的分段是否为核心姓氏部分,过滤前后缀、缩写""" seg = seg.strip() # 过滤规则:带点的后缀、全大写且长度<=3的缩写/罗马数字、全小写开头的前缀 if '.' in seg or (seg.isupper() and len(seg) <= 3) or seg.islower(): return False return True transformed_list = [] for name_str in current_list: # 只按第一个逗号拆分,避免拆分姓内部的空格 last_raw, first_raw = name_str.split(',', 1) # 提取正式名:取逗号后第一个词 first_name = first_raw.strip().split()[0] # 清洗姓氏:过滤无效分段后拼接 last_name = ' '.join([seg for seg in last_raw.strip().split() if is_valid_last_segment(seg)]) # 拼接成目标格式 transformed_list.append(f"{first_name} {last_name}")
运行后得到的transformed_list和期望输出完全一致。如果需要适配更多特殊姓名格式,只要调整is_valid_last_segment里的过滤规则即可。如果偏好更简洁的lambda风格写法,也可以用map配合列表推导实现,逻辑完全一致。
内容的提问来源于stack exchange,提问作者davida28
相关产品推荐
相关产品推荐

