如何基于Numpy数组子串匹配DataFrame内容并生成新列?
你可以直接用pandas自带的字符串提取方法实现需求,不需要嵌套np.where,代码更简洁易维护,同时完全对齐原有逻辑的匹配优先级(按animal_list的顺序优先匹配先出现的子串)。
实现代码
import pandas as pd import numpy as np # 如需处理带正则特殊字符的子串,可导入re模块做转义 # import re # 路径定义 csv_report = filepath # 读取CSV生成DataFrame csv_df = pd.read_csv(csv_report) animal_list = np.array(['Condor', 'Marmot','Bear','Pika','Rat','Racoon','Opossum']) # 构建正则匹配规则,按列表顺序优先匹配 # 如果子串包含正则特殊字符(. * + ? 等),改用下行写法转义: # pattern = '|'.join(re.escape(item) for item in animal_list) pattern = '|'.join(animal_list) # 从item_name列提取匹配到的子串写入animal列 csv_df['animal'] = csv_df['item_name'].str.extract(f'({pattern})', expand=False)
逻辑说明
- 原有嵌套np.where的逻辑是按你输入子串的顺序依次匹配,命中第一个符合的子串就停止后续匹配,上面的写法通过正则
|的优先匹配规则完全对齐该逻辑 - 如果某行item_name没有匹配到任何animal_list里的子串,animal列对应位置会返回NaN,和原有逻辑的输出结果完全一致
- 该方法是pandas向量化操作,比嵌套np.where或者行遍历apply的效率更高,子串数量多的时候优势更明显
内容的提问来源于stack exchange,提问作者doubledribble
相关产品推荐
相关产品推荐

