如何在Pandas新列中同时输出所有匹配的目标值?
Pandas:提取指定列中所有匹配的目标值并生成新列
你的问题出在自定义的match函数上——它找到第一个匹配项后就直接返回了,所以只能得到单个值。要获取所有匹配的目标值,需要先收集所有符合条件的项,再将它们合并成字符串。
方法一:修改自定义函数
调整match函数,先遍历目标列表收集所有匹配项,再用分号连接:
# coding=utf-8 import pandas as pd import numpy as np classes = [('Carbon;Pyruvate;vitamins', 16.7), ('Pyruvate;Carbohydrate;Pentose and glucuronate', 30), ('Lipid;Carbon;Galactose', 40.5), ('Galactose;Pyruvate;Fatty acid', 57), ('Fatty acid;Lipid', 22)] labels = ['Ko_class','FPKM'] alls = pd.DataFrame.from_records(classes, columns=labels) target =['Carbon', 'Pyruvate','Galactose'] def match(x): # 收集当前行中所有匹配的目标值 matched_items = [item for item in target if item in x] # 如果有匹配项就用分号连接,否则返回NaN return ';'.join(matched_items) if matched_items else np.nan alls['Pathways'] = alls['Ko_class'].apply(match)
方法二:用Pandas向量化操作(更高效)
利用str.findall结合正则表达式,直接提取所有匹配项,再合并成字符串:
# coding=utf-8 import pandas as pd import numpy as np classes = [('Carbon;Pyruvate;vitamins', 16.7), ('Pyruvate;Carbohydrate;Pentose and glucuronate', 30), ('Lipid;Carbon;Galactose', 40.5), ('Galactose;Pyruvate;Fatty acid', 57), ('Fatty acid;Lipid', 22)] labels = ['Ko_class','FPKM'] alls = pd.DataFrame.from_records(classes, columns=labels) target =['Carbon', 'Pyruvate','Galactose'] # 构建正则匹配模式,用|分隔所有目标值 match_pattern = '|'.join(target) # 提取所有匹配项并转为分号连接的字符串,无匹配则返回NaN alls['Pathways'] = alls['Ko_class'].str.findall(match_pattern)\ .apply(lambda lst: ';'.join(lst) if lst else np.nan)
运行结果
两种方法都会得到你期望的输出:
Ko_class FPKM Pathways 0 Carbon;Pyruvate;vitamins 16.7 Carbon;Pyruvate 1 Pyruvate;Carbohydrate;Pentose and glucuronate 30.0 Pyruvate 2 Lipid;Carbon;Galactose 40.5 Carbon;Galactose 3 Galactose;Pyruvate;Fatty acid 57.0 Galactose;Pyruvate 4 Fatty acid;Lipid 22.0 NaN
内容的提问来源于stack exchange,提问作者yan wang
相关产品推荐
相关产品推荐

