Pandas按不同统计频率阈值创建列报ValueError如何解决?
错误原因
你写的if df_prod_stats.loc[df_prod_stats['frequency'] == "daily"]判断逻辑错误:该表达式返回的是符合条件的所有行组成的子DataFrame,不是单个布尔标量,Python无法直接判断整个DataFrame的真值,因此抛出歧义错误。
另外你的if/elif写法是全局流程控制,不会逐行判断DataFrame的每一行取值,即使不报错也得不到预期的逐行匹配结果。
解决方案
方案1:嵌套np.where实现(和原代码思路最接近)
直接使用np.where的向量化判断逐行匹配条件,不需要写if/elif流程控制:
import numpy as np df_prod_stats['target_met'] = np.where( df_prod_stats['frequency'] == 'daily', np.where(df_prod_stats['loss_weight'] < 0.5, 1, 0), np.where( df_prod_stats['frequency'] == 'monthly', np.where(df_prod_stats['loss_weight'] < 15, 1, 0), np.where(df_prod_stats['loss_weight'] < 3.5, 1, 0) ) )
方案2:阈值映射法(更简洁易维护)
提前定义不同频率对应的减重阈值字典,通过映射得到每一行的阈值后直接比较,后续新增频率只需要修改字典即可:
# 定义频率-阈值映射关系 threshold_map = { 'daily': 0.5, 'monthly': 15, 'weekly': 3.5 } # 映射得到每行对应的阈值,再比较得到结果,转成1/0格式 df_prod_stats['target_met'] = ( df_prod_stats['loss_weight'] < df_prod_stats['frequency'].map(threshold_map) ).astype(int)
内容的提问来源于stack exchange,提问作者user13696679
相关产品推荐
相关产品推荐

