Pandas按prod_id分组判断第n大值≥30生成新列的报错解决
报错原因
你的代码触发ValueError有两个核心问题:
lambda里的df['perc_dem_near_wh'].nlargest(2)返回的是一个包含2个元素的Series对象,你直接用and把单个值x和Series做布尔判断,pandas无法判定整个序列的布尔值,因此抛出歧义错误。- 代码没有按
prod_id分组计算第n大值,逻辑完全不符合你的需求。
正确实现方案
你可以先给每个prod_id分组内的需求值算倒序排名,再批量生成所有目标列,不用逐列重复写代码:
import pandas as pd # 先按prod_id分组,对需求值做倒序排名,method='first'避免并列值干扰排名顺序 df['rank'] = df.groupby('prod_id')['demand_near_wh'].rank(ascending=False, method='first').astype(int) # 批量生成1-5对应的标识列 for n in range(1, 6): # 生成列名 if n == 1: col_name = '1st_wh' elif n == 2: col_name = '2nd_wh' elif n == 3: col_name = '3rd_wh' else: col_name = f'{n}th_wh' # 按规则赋值:排名等于n 且 需求值≥30则为True,否则为False df[col_name] = (df['rank'] == n) & (df['demand_near_wh'] >= 30) # 删掉临时的排名列(不需要可以保留) df.drop('rank', axis=1, inplace=True)
如果你的实际计算用的是代码里的perc_dem_near_wh字段,把上面代码里的demand_near_wh替换成对应字段名即可。如果你的需求里4、5名不需要满足≥30的限制,调整对应判断条件即可。
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

