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
相关产品推荐
相关产品推荐

