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

Python pandas基于DataFrame多条件判断创建新列及报错解决方法

错误原因
  • 行处理函数误用全局DataFrame而非当前行:你在func内部直接使用final['列名']取的是整个表的列,返回的是Series对象,对Series直接做布尔判断会触发歧义错误。按行apply时应该用参数row获取当前行的字段值
  • 多余的布尔转换逻辑错误:is_trial_period是字符串类型的'FALSE'/'TRUE',bool('FALSE')在Python中会返回True,直接导致判断逻辑完全偏离预期
  • 最后一个分支条件写错:你最后一个elif仍判断is_trial_period为FALSE,实际应该对应TRUE且过期的场景
正确实现方案

方案1:修正你的apply写法

def func(row):
    is_trial = row['is_trial_period']
    exp_date = row['Expiration_date']
    cur_date = row['current_date']
    if is_trial == 'FALSE':
        if exp_date >= cur_date:
            return 'Active Subscription'
        else:
            return 'Expired Subscription'
    else: # 对应is_trial_period为TRUE的情况
        if exp_date >= cur_date:
            return 'Active Trial'
        else:
            return 'Expired Trial'

final['XYZ'] = final.apply(func, axis=1)

方案2(更推荐,性能更高):向量化条件判断

用numpy.select实现向量化运算,数据量大时远快于行遍历的apply:

import numpy as np

# 定义所有判断条件
conditions = [
    (final['is_trial_period'] == 'FALSE') & (final['Expiration_date'] >= final['current_date']),
    (final['is_trial_period'] == 'FALSE') & (final['Expiration_date'] < final['current_date']),
    (final['is_trial_period'] == 'TRUE') & (final['Expiration_date'] >= final['current_date']),
    (final['is_trial_period'] == 'TRUE') & (final['Expiration_date'] < final['current_date'])
]

# 定义条件对应的值
values = [
    'Active Subscription',
    'Expired Subscription',
    'Active Trial',
    'Expired Trial'
]

# 生成新列
final['XYZ'] = np.select(conditions, values)

两种方案最终输出的结果都和你预期的完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:36:03