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

Pandas按prod_id分组判断第n大值≥30生成新列的报错解决

报错原因

你的代码触发ValueError有两个核心问题:

  1. lambda里的df['perc_dem_near_wh'].nlargest(2)返回的是一个包含2个元素的Series对象,你直接用and把单个值x和Series做布尔判断,pandas无法判定整个序列的布尔值,因此抛出歧义错误。
  2. 代码没有按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:36:04