如何编写Pandas函数检测两字符串是否存在于多列中
问题修正与实现方案
你的代码存在语法错误、逻辑适配问题,以下是针对需求的修正方案:
核心问题梳理
elif缺少判断条件,属于语法错误;- 若通过
apply逐行处理DataFrame,函数接收的是单个字符串而非Series,不能用.str.contains()和.any(); - 正则表达式
Test1无法匹配DataFrame里的Test 1(带空格),需调整正则兼容两种写法。
方案1:逐行判断(每行单独验证条件)
适合需求为每行独立判断是否满足双条件的场景:
import pandas as pd # 调整正则,\s?匹配可选空格,兼容Test1和Test 1 pattern_one = r'Test\s?1|Exam12' df = pd.DataFrame({'项目编码':['32132','212132'],'任务名称':['Test 1','Test13']}) def data_filter(project_code, task_name): # 单个值的条件判断 if '32132' in project_code and pd.Series([task_name]).str.contains(pattern_one, regex=True).iloc[0]: return '45%' else: return '0%' # 应用到每行,生成结果列 df['结果'] = df.apply(lambda row: data_filter(row['项目编码'], row['任务名称']), axis=1)
执行后输出的DataFrame:
| 项目编码 | 任务名称 | 结果 |
|---|---|---|
| 32132 | Test 1 | 45% |
| 212132 | Test13 | 0% |
方案2:全局批量判断(整表验证是否存在符合条件的行)
适合需求为只要表中存在任意一行满足双条件,就给所有行统一赋值的场景:
import pandas as pd pattern_one = r'Test\s?1|Exam12' df = pd.DataFrame({'项目编码':['32132','212132'],'任务名称':['Test 1','Test13']}) # 全局判断是否存在符合条件的行 has_valid_row = ((df['项目编码'].str.contains('32132')) & (df['任务名称'].str.contains(pattern_one))).any() # 批量赋值结果 df['结果'] = '45%' if has_valid_row else '0%'
执行后所有行结果为45%,因为表中存在符合条件的行。
内容的提问来源于stack exchange,提问作者hydrology_guy22
相关产品推荐
相关产品推荐

