Python Pandas:移除含(Retired)标记的姓名及分隔符
问题描述
我有一个存储姓名的DataFrame(变量名为df)列,需要移除所有带有(Retired)或(retired)标记的姓名及其对应的分号;但标记格式不固定,有时单元格含多个姓名仅其中一个退休,有时名后直接跟退休标记再跟姓。尝试使用replace方法无效,寻求解决方向。
当前状态示例:
Owner Name George (Georgy) (Retired) Clooney Meghan (retired) Markle Harry Porter (Retired) Hermione Granger; Harry Porter (Retired) Ginny Weasley; Ron Weasley; Harry Porter (retired); Luna Lovegood
期望状态示例:
Owner Name Null Null Null Hermione Granger Ginny Weasley; Ron Weasley; Luna Lovegood
解决思路与代码实现
replace方法之所以无效,是因为它只能匹配固定字符串或简单正则,没法精准识别带退休标记的完整姓名项。这里提供两种可行的处理方案:
方法一:拆分过滤法(直观易理解)
核心思路是把每个单元格的姓名拆成列表,过滤掉带退休标记的项,再重新拼接:
- 按
;拆分每个单元格的姓名列表 - 剔除包含
(Retired)或(retired)的姓名 - 拼接过滤后的结果,空内容则替换为
Null
代码示例:
import pandas as pd def filter_retired_names(names_str): if pd.isna(names_str): return 'Null' # 拆分姓名为列表 names_list = names_str.split('; ') # 过滤掉带退休标记的姓名 filtered_names = [name for name in names_list if not ('(Retired)' in name or '(retired)' in name)] # 拼接结果,空则返回Null return '; '.join(filtered_names) if filtered_names else 'Null' # 应用到目标列 df['Owner Name'] = df['Owner Name'].apply(filter_retired_names)
方法二:正则替换法(高效简洁)
用正则表达式直接匹配并移除带退休标记的姓名项(包括前后关联的分号):
- 正则
(?:; )?[^;]*\(retired\)[^;]*(?:; )?可以匹配:可选的前置;+ 包含退休标记的任意姓名内容 + 可选的后置; - 用
re.IGNORECASE忽略大小写,统一处理(Retired)和(retired) - 最后清理首尾残留的分号,空内容替换为
Null
代码示例:
import pandas as pd import re def clean_retired_names(names_str): if pd.isna(names_str): return 'Null' # 匹配并移除带退休标记的姓名项 cleaned = re.sub(r'(?:; )?[^;]*\(retired\)[^;]*(?:; )?', '', names_str, flags=re.IGNORECASE) # 清理首尾可能残留的分号和空格 cleaned = cleaned.strip('; ') # 空内容返回Null return cleaned if cleaned else 'Null' df['Owner Name'] = df['Owner Name'].apply(clean_retired_names)
两种方法都能实现需求:拆分过滤法逻辑直白,适合新手调试;正则法处理速度更快,适合大数据量场景。
内容的提问来源于stack exchange,提问作者Ziggy
相关产品推荐
相关产品推荐

