如何判断DataFrame单元格包含指定值并按条件填充对应字段
实现代码
方法1:使用numpy.select实现(兼容性最佳)
import pandas as pd import numpy as np # 构造示例数据,你可以替换为自己的实际数据源 df = pd.DataFrame({ 'Column_1': [ 'ABC DEF EFG HIJ', 'ZCG VHT UIO QAR', 'ABC KLM MNO STU', 'DEF KLM ABD EFG' ] }) # 定义匹配条件和对应返回值 conditions = [ df['Column_1'].str.contains(r'\bABC\b') & ~df['Column_1'].str.contains(r'\bKLM\b'), ~df['Column_1'].str.contains(r'\bABC\b') & df['Column_1'].str.contains(r'\bKLM\b'), df['Column_1'].str.contains(r'\bABC\b') & df['Column_1'].str.contains(r'\bKLM\b') ] values = [1, 2, 3] # 赋值结果,未匹配到上述条件的默认返回4 df['Column_1'] = np.select(conditions, values, default=4) print(df)
输出结果和预期完全一致:
Column_1 0 1 1 4 2 3 3 2
方法2:使用pandas原生case_when实现(pandas 1.4.0及以上版本支持)
如果你的pandas版本足够高,可以用更简洁的原生语法实现:
df['Column_1'] = df['Column_1'].case_when( [ lambda x: x.str.contains(r'\bABC\b') & ~x.str.contains(r'\bKLM\b'), 1, lambda x: ~x.str.contains(r'\bABC\b') & x.str.contains(r'\bKLM\b'), 2, lambda x: x.str.contains(r'\bABC\b') & x.str.contains(r'\bKLM\b'), 3 ], default=4 )
注意事项
代码里的r'\bABC\b'使用了正则单词边界匹配,确保只会匹配空格分隔的独立ABC单词,避免匹配到类似XABC、ABC1这类包含ABC子串的内容造成误判。如果你的场景不需要严格匹配独立单词,直接把r'\b'去掉,写str.contains('ABC')即可。
内容的提问来源于stack exchange,提问作者Chandan N
相关产品推荐
相关产品推荐

