You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

DataFrame同Id下筛选订单量最大供应商问题求助

解决按Id分组筛选订单总量最大供应商的问题

我来帮你搞定这个需求!你遇到的ValueError: The truth value of a Series is ambiguous,通常是因为直接对整个Series做布尔判断(比如用if语句判断一个多值的Series),Python没法确定你要的是“任意满足”还是“全部满足”,所以报错。咱们一步步来实现你要的逻辑:

步骤1:准备示例数据

先把你的示例数据加载好:

import pandas as pd

data = pd.DataFrame({
    'Id' : ['001', '001', '001', '001', '002', '002', '002', '003', '003', '003'],
    'Supplier' : ['ABC', 'ABC', 'ABZ', 'ANA', 'ABA', 'ABC', 'ASS', 'ASS', 'ASS', 'ASS'],
    'BuyPrice' : [7,7,7,8,7,5,7,7,7,7],
    'Quantity' : [200,20,50,40,210,47,66,53,100,60]
})

步骤2:聚合每个Id+供应商的总订单量

首先按IdSupplier分组,计算每个供应商的总订单量,同时保留对应的BuyPrice(你的数据里同一Id+供应商的价格是一致的,所以用first()取第一个值就行):

# 分组聚合,得到每个Id下各供应商的总订单量和对应价格
agg_data = data.groupby(['Id', 'Supplier']).agg(
    total_quantity=('Quantity', 'sum'),
    BuyPrice=('BuyPrice', 'first')
).reset_index()

这一步会得到这样的中间结果:

IdSuppliertotal_quantityBuyPrice
001ABC2207
001ABZ507
001ANA408
002ABA2107
002ABC475
002ASS667
003ASS2137

步骤3:筛选每个Id下订单量最大的供应商

接下来按Id分组,在每个组内找出total_quantity最大的那一行:

# 按Id分组,筛选组内订单量最大的供应商
result = agg_data.groupby('Id').apply(
    lambda x: x[x['total_quantity'] == x['total_quantity'].max()]
).reset_index(drop=True)

这里用lambda函数在每个分组内操作,避免了直接判断整个Series的问题——x代表每个Id对应的子DataFrame,我们在子DataFrame里筛选出总订单量等于该组最大值的行。

步骤4:整理成目标格式

最后调整列名和结构,得到你想要的结果:

# 重命名列并调整顺序
final_result = result[['Id', 'Supplier', 'BuyPrice']].rename(columns={'Supplier': 'main_supplier'})

运行后final_result就是你要的目标数据:

Idmain_supplierBuyPrice
001ABC7
002ABA7
003ASS7

更简洁的替代方法

如果数据量较大,用排序+取首行的方式会更高效:

agg_data = data.groupby(['Id', 'Supplier']).agg(
    total_quantity=('Quantity', 'sum'),
    BuyPrice=('BuyPrice', 'first')
).reset_index()

# 按Id升序、总订单量降序排序,然后取每个Id的第一行
final_result = agg_data.sort_values(['Id', 'total_quantity'], ascending=[True, False])\
                       .groupby('Id').head(1)\
                       .rename(columns={'Supplier': 'main_supplier'})\
                       [['Id', 'main_supplier', 'BuyPrice']]\
                       .reset_index(drop=True)

为什么你之前会报错?

你遇到的ValueError,大概率是因为写了类似这样的代码:

# 错误示例:直接对整个Series做布尔判断
if agg_data['total_quantity'] == agg_data['total_quantity'].max():
    ...

这种写法会让Python困惑——它不知道你要判断的是整个Series所有值都等于最大值,还是存在任意一个值等于最大值。解决的核心就是在每个分组内进行判断,也就是用groupby.apply或者排序后取首行的方式,把判断限制在单个Id的子数据集里。

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

火山引擎 最新活动