如何快速移除Pandas DataFrame列中的国家信息保留指定姓名?
移除DataFrame中name列的国家信息问题
问题背景
现有列表:
names = ['kramer hickok', 'carlos ortiz ', 'talor gooch', 'mikumu horikawa', 'yoshinori fujimoto']
以及pandas DataFrame page:
| name | |
|---|---|
| 0 | kramer hickok united states |
| 1 | carlos ortiz mexico |
| 2 | talor gooch united states |
| 3 | mikumu horikawa japan |
| 4 | yoshinori fujimoto japan |
需要移除name列中的国家信息,得到如下结果:
| name | |
|---|---|
| 0 | kramer hickok |
| 1 | carlos ortiz |
| 2 | talor gooch |
| 3 | mikumu horikawa |
| 4 | yoshinori fujimoto |
尝试以下代码但无效:
for name in names: page['name'] = page['name'].str.extract(name)
解决方案
方法1:直接利用已有names列表(最快)
因为names列表的内容和目标结果完全匹配,且顺序与DataFrame行一一对应,直接赋值即可:
page['name'] = names # 可选:统一清理首尾空格 page['name'] = page['name'].str.strip()
这是效率最高的方式,时间复杂度O(n),无需额外字符串处理。
方法2:正则匹配提取目标名字
如果names列表顺序不确定,或需要从原字符串中精准提取,可构造正则匹配:
import re import pandas as pd # 先清理names中的首尾空格 clean_names = [name.strip() for name in names] # 构造正则模式,匹配任意一个目标名字 pattern = r'(' + '|'.join(re.escape(name) for name in clean_names) + r')' # 提取匹配内容 page['name'] = page['name'].str.extract(pattern)[0]
re.escape用于处理名字中的特殊字符,避免正则语法冲突,确保每个名字都能被准确匹配。
方法3:按单词分割移除最后部分(通用场景)
如果不知道具体名字,仅知道国家是最后一个单词,可从右侧分割字符串:
# 从右侧分割1次,取前半部分并去除首尾空格 page['name'] = page['name'].str.rsplit(n=1).str[0].str.strip()
该方法无需依赖names列表,适合国家均为单个单词的通用场景。
原代码无效原因
你之前的循环中,str.extract需要传入正则表达式格式的参数,而直接传入name无法匹配;同时循环会反复覆盖page['name']的赋值,最终仅保留最后一次匹配的结果,因此无法得到预期效果。
内容的提问来源于stack exchange,提问作者HJA24
相关产品推荐
相关产品推荐

