如何基于三类规则在Pandas中从DataFrame多列生成新列SUITEDET
解决方案
不需要生成3个DataFrame合并,推荐使用numpy.select向量化方法实现多条件匹配,代码简洁且执行效率远高于逐行操作:
首先导入依赖:
import pandas as pd import numpy as np
然后按规则配置条件与对应取值(条件按优先级从高到低排列,先匹配到的规则优先生效,完全符合你的需求逻辑):
# 你的配置列表 usedet = ['pmbac1','pmbac2','pmbac3','pmbac4','pmbac5','pmbac6','bact1','bact2','bact3','bact4','bact5','bact6','bactAdd1','bactAdd2','bactAdd3','abbac1','abbac2','abbac3','abbac4','abbac5','abbac6','BrachSmear','Brachy','Brachy1','Brachy10','Brachy2','Brachy3','Brachy4','Brachy5','Brachy6','Brachy7','Brachy8','Brachy9','BhyC','isol','salm1','salm2','salm3','salm4','pmavb1','pmavb2','pmavb3','pmavb4','pmavb5','pmavb6','pmavsh','pmavsp','cult','zncult','pmfoBK','pmfood','Coccn','Coccid','CoccidGoat','Strngy','StoidE','Stoide','Nemato','NematE','TrichE','Tricd','Tricm','Trico','Trics','Tricu','Monspp','Fecn','BhyC21','BhyCID','BhyCPC','BhyCPCTrig','BhyClt','isol1','isol1C','isol1F','isol1M','isol1S','isol2','isol2C','isol2F','isol2M','isol2S','isol3','isol3C','isol3F','isol3M','isol3S','isolA','isolB','isolC'] usesuite = ["HAEMFF","HAEM4F","INCLIN","BOCOSP","OVCOSP","WECOCF","WECOCA","WECOCP","ECOPCR","BLKWEC","BLKWF","BLKFLK","FLKIND","WECFLK","BHYCULT","BHY21","INCH","LEPTMS","GSH-PX","HISTO","CHLEIAS","CHLEIAG","BVD","BVDANT","BVDAB","CLA","IBRMS","SINFAB","JMILKI","JMILKB","BVDMS","BVDIND","BVDPCR","SBVIMB","SBVIMI","RUMENE","FATLIV","DOWNER","BMMETP","FAMIN","OMETAP","BOVPRO","OPRODP","COPBLK","COPRO","RESPCR"] # 按优先级从高到低定义条件 conditions = [ df['SUITE'].isnull(), # 规则1:SUITE为空 df['DET'].isin(usedet), # 规则2:DET在指定列表 df['SUITE'].isin(usesuite) # 规则3:SUITE在指定列表 ] # 定义每个条件对应的取值 choices = [ df['DET'], df['SUITE'], df['SUITE'] ] # 生成SUITEDET列,未匹配到的默认设为NaN,可按需修改默认值 df['SUITEDET'] = np.select(conditions, choices, default=np.nan)
可查询方向
如果需要了解更多相关用法,可以搜索以下关键词:
- pandas 多条件赋值
- numpy.select 用法
- pandas 向量化操作
内容的提问来源于stack exchange,提问作者Josh Fox
相关产品推荐
相关产品推荐

