Pandas基于列表的部分字符串匹配:提取匹配值并新增列
解决DataFrame基于列表的部分字符串匹配并提取匹配值问题
嘿,我来帮你搞定这个需求!你需要对DataFrame的items列做基于目标列表的部分匹配,新增status、count和matching_values三列对吧?直接上可运行的解决方案:
步骤1:准备数据和目标匹配列表
首先我们先定义你的基础DataFrame和匹配列表(这里我假设你的匹配列表是["apple", "cat", "dog"],你可以根据实际需求替换):
import pandas as pd # 你的原始数据 df = pd.DataFrame({ 'items': ['grape', 'apple', 'cat, dog', 'dog, other'] }) # 自定义的匹配列表 target_list = ["apple", "cat", "dog"]
步骤2:编写匹配处理函数
我们写一个函数来逐行处理items列,提取匹配结果:
# 把列表转成集合,提升匹配效率(如果列表很大的话效果明显) target_set = set(target_list) def extract_matches(row): # 处理空值情况(如果你的数据里有NaN的话) if pd.isna(row['items']): return pd.Series([False, 0, pd.NA]) # 把items按逗号分割并去除前后空格,避免空格导致匹配失败 split_items = [item.strip() for item in row['items'].split(',')] # 筛选出在目标集合里的元素 matched_items = [item for item in split_items if item in target_set] # 返回三个需要的字段 return pd.Series([ len(matched_items) > 0, # status:是否存在匹配 len(matched_items), # count:匹配到的元素数量 ', '.join(matched_items) if matched_items else pd.NA # 匹配到的元素,无则返回NA ])
步骤3:新增列并查看结果
调用apply函数把处理结果赋值给新列:
# 新增三列 df[['status', 'count', 'matching_values']] = df.apply(extract_matches, axis=1) # 查看最终结果 print(df)
运行后你会得到期望的输出:
items status count matching_values 0 grape False 0 <NA> 1 apple True 1 apple 2 cat, dog True 2 cat, dog 3 dog, other True 1 dog
关键细节说明
- 处理空格问题:用
strip()去除分割后每个元素的前后空格,避免像' dog'这种带空格的元素匹配不到目标列表里的'dog'。 - 效率优化:把目标列表转成
set,因为集合的成员查询(in操作)比列表快很多,当你的匹配列表很大时这个优化很有用。 - 空值处理:函数里先判断
items是否为NaN,避免分割空值时报错,同时返回合理的默认值。
内容的提问来源于stack exchange,提问作者Jerry
相关产品推荐
相关产品推荐

