Pandas DataFrame条件生成新变量md遇语法错误,求正确实现方案
Pandas条件生成新列问题解决
样本数据
import pandas as pd df = pd.DataFrame({'id':[1,2,3,4,5], 'cfs':['REFER', 'DECLINE','PASS','REFER','REFER'], 'ofs':['DECLINE','DECLINE', 'PASS','REFER','PASS'], 'ffs':['PASS','DECLINE','PASS','REFER','PASS']})
问题描述
尝试通过条件语句生成新列md时出现syntaxerror: invalid syntax,错误代码如下:
# If else condition approach if all df['cfs'] == 'DECLINE' | df['ofs'] == 'DECLINE' | df['ffs'] == 'DECLINE': df['md'] =='DECLINE' else: if df['cfs'] == 'PASS' & df['ofs'] == 'PASS' & df['ffs'] == 'PASS': df['md'] =='PASS' else: if any df['cfs'] == 'REFER' if df['ofs'] == 'REFER' if df['ffs'] == 'REFER': df['md'] =='REFER' else: df['md'] =='REFER'
需满足的条件:
- 若cfs、ofs或ffs为
DECLINE,则md='DECLINE' - 若cfs、ofs和ffs均为
PASS,则md='PASS' - 若cfs、ofs和ffs均为
REFER,则md='REFER' - 若cfs、ofs和ffs为
PASS与REFER的组合,则md='REFER'
错误原因
- 直接用Python原生
if/else处理Pandas Series:df['cfs'] == 'DECLINE'返回布尔Series,而非单个布尔值,无法用于原生if判断 - 逻辑运算符优先级错误:
|/&优先级高于比较运算符,需给比较条件加括号 - 赋值错误:使用
==(比较)而非=(赋值) all/any用法错误:未针对每行数据应用,而是直接处理整列
正确实现方法
方法一:使用numpy.select(推荐,向量化操作效率高)
import numpy as np # 定义条件列表与对应结果 conditions = [ # 条件1:任意一列是DECLINE (df['cfs'] == 'DECLINE') | (df['ofs'] == 'DECLINE') | (df['ffs'] == 'DECLINE'), # 条件2:所有列都是PASS (df['cfs'] == 'PASS') & (df['ofs'] == 'PASS') & (df['ffs'] == 'PASS'), # 条件3:仅包含PASS和REFER的情况 df[['cfs', 'ofs', 'ffs']].isin(['PASS', 'REFER']).all(axis=1) ] values = ['DECLINE', 'PASS', 'REFER'] # 生成md列 df['md'] = np.select(conditions, values, default='REFER')
方法二:使用apply逐行处理(适合小数据集)
def get_md_value(row): # 优先检查DECLINE if row['cfs'] == 'DECLINE' or row['ofs'] == 'DECLINE' or row['ffs'] == 'DECLINE': return 'DECLINE' # 检查全PASS elif row['cfs'] == 'PASS' and row['ofs'] == 'PASS' and row['ffs'] == 'PASS': return 'PASS' # 剩余情况均返回REFER else: return 'REFER' df['md'] = df.apply(get_md_value, axis=1)
最终结果
处理后的数据框如下:
| id | cfs | ofs | ffs | md |
|---|---|---|---|---|
| 1 | REFER | DECLINE | PASS | DECLINE |
| 2 | DECLINE | DECLINE | DECLINE | DECLINE |
| 3 | PASS | PASS | PASS | PASS |
| 4 | REFER | REFER | REFER | REFER |
| 5 | REFER | PASS | PASS | REFER |
内容的提问来源于stack exchange,提问作者Ricky
相关产品推荐
相关产品推荐

