You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'

错误原因

  1. 直接用Python原生if/else处理Pandas Series:df['cfs'] == 'DECLINE'返回布尔Series,而非单个布尔值,无法用于原生if判断
  2. 逻辑运算符优先级错误:|/&优先级高于比较运算符,需给比较条件加括号
  3. 赋值错误:使用==(比较)而非=(赋值)
  4. 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)

最终结果

处理后的数据框如下:

idcfsofsffsmd
1REFERDECLINEPASSDECLINE
2DECLINEDECLINEDECLINEDECLINE
3PASSPASSPASSPASS
4REFERREFERREFERREFER
5REFERPASSPASSREFER

内容的提问来源于stack exchange,提问作者Ricky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:05:34