如何将列表与DataFrame列匹配,提取字符串结尾的位置码至新列?
解决DataFrame提取结尾位置码的问题
问题分析
你当前的代码存在两个核心问题:
- 循环缩进错误:内层遍历
locations的循环没有嵌套在遍历DataFrame字符串列的循环里,导致逻辑完全脱节 - 缺失判断条件:
if语句后没有写具体的匹配逻辑
另外,直接用str.endswith()没生效,是因为该方法传入列表时需要先转成元组,且仅返回布尔值,无法直接提取匹配的位置码。
方法一:修复你的循环逻辑
调整缩进,补充匹配判断,遍历每个字符串时检查是否以某个位置码结尾:
import pandas as pd locations = ["AG CHEM", "AG SEED", "BH CHEM", "BH FARM", 'BH GREEN', 'CT CHEM', 'Bighorn Farm', 'Courthouse Farm'] # 示例DataFrame df = pd.DataFrame({"str": ["Growers SeGrowersSecret 14AG CHEM", "Test Farm BH FARM", "Sample Text Courthouse Farm"]}) loc = [] for s in df["str"]: matched = None # 遍历所有位置码,检查是否为字符串结尾 for code in locations: if s.endswith(code): matched = code break # 找到第一个匹配项就停止 loc.append(matched if matched else "") # 无匹配则留空 df["Location Code"] = loc
方法二:用Pandas的apply简化代码
利用apply对每行字符串做匹配,更符合Pandas的风格:
def extract_location(s): for code in locations: if s.endswith(code): return code return "" df["Location Code"] = df["str"].apply(extract_location)
方法三:正则表达式提取(更高效)
把位置码转成正则表达式的备选模式,直接提取结尾的匹配项:
import re # 转义特殊字符,避免正则语法冲突 pattern = re.compile(r'(' + '|'.join(re.escape(code) for code in locations) + ')$') df["Location Code"] = df["str"].str.extract(pattern, expand=False).fillna("")
这种方法适合数据量较大的场景,执行效率比循环更高。
内容的提问来源于stack exchange,提问作者eltoukhy
相关产品推荐
相关产品推荐

