Pandas遍历多列匹配关键词生成flag列结果异常求助
解决Pandas多列关键词匹配生成flag列的问题
你的循环代码核心问题是每次赋值都会覆盖之前的flag列结果,最终只保留最后一列的判断,完全不符合“任意列匹配就标记1”的需求。以下是正确的实现方式:
方法1:逐行检查所有列(直观易读)
直接对每行遍历所有单元格,判断是否包含任意关键词:
import pandas as pd # Sample DataFrame data = {'column1': ['sp123', 'abc', 'sp456', 'def'], 'column2': ['tp1234', 'abc', 'sp4256', 'def'], 'column3': ['syp123', 'abc', 'sp456', 'def']} df = pd.DataFrame(data) # List of keywords keywords = ['sp', 'xyz'] # 新增flag列:任意列包含关键词则标记为1 df['flag'] = df.apply( lambda row: 1 if any(keyword in str(cell) for cell in row for keyword in keywords) else 0, axis=1 # axis=1表示按行处理 ) print(df)
方法2:使用字符串匹配优化性能(更高效)
利用str.contains批量匹配,再通过any(axis=1)判断每行是否有匹配项:
import pandas as pd data = {'column1': ['sp123', 'abc', 'sp456', 'def'], 'column2': ['tp1234', 'abc', 'sp4256', 'def'], 'column3': ['syp123', 'abc', 'sp456', 'def']} df = pd.DataFrame(data) keywords = ['sp', 'xyz'] # 拼接关键词为正则表达式 pattern = '|'.join(keywords) # 对所有列执行字符串匹配,再取每行的逻辑或,最后转成int类型 df['flag'] = df.astype(str).apply(lambda col: col.str.contains(pattern, na=False), axis=0).any(axis=1).astype(int) print(df)
两种方法运行后都会得到预期结果:
column1 column2 column3 flag 0 sp123 tp1234 syp123 1 1 abc abc abc 0 2 sp456 sp4256 sp456 1 3 def def def 0
内容的提问来源于stack exchange,提问作者TIC-FLY
相关产品推荐
相关产品推荐

