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

如何获取Pandas中按金额排序的Top N商品及对应供应商?

获取Top N商品及其对应供应商的解决方案

首先,先修正一个基础问题:你的dollar_amount列是字符串类型,直接分组求和会得到字符串拼接的错误结果,所以第一步要先把它转换成数值类型。接下来我们一步步实现你要的需求——给按总金额排序的Top N商品,匹配对应的核心供应商(这里我们取每个商品下贡献总金额最高的供应商;如果有多个供应商金额相同,会取第一个出现的)。

步骤1:数据预处理

先把金额列转为数值型,确保后续计算正确:

import pandas as pd

# 你的原始数据
df = pd.DataFrame(data={'item_code': ['Item1', 'Item2', 'Item3', 'Item1', 'Item1', 'Item2', 'Item2', 'Item1', 'Item3'], 
                        'dollar_amount': ['200.25', '350.00', '120.00', '400.50', '1001.25', '700.00', '350.00', '200.25', '240.00'], 
                        'supplier_code': ['Sup1','Sup1','Sup2','Sup1','Sup1','Sup1','Sup1','Sup2','Sup2']})

# 转换金额列类型为浮点型
df['dollar_amount'] = df['dollar_amount'].astype(float)

步骤2:计算每个商品的总金额并取Top N

这部分你已经有了基础实现,我们稍作调整确保逻辑严谨:

N = 3  # 这里可以替换成你需要的Top数量,比如5、15等

# 按商品分组,计算每个商品的总金额
item_total = df.groupby('item_code', as_index=False)['dollar_amount'].sum()
# 按总金额降序排序,提取Top N商品
top_items = item_total.sort_values(by='dollar_amount', ascending=False).head(N)

步骤3:找到每个Top商品对应的核心供应商

我们需要计算每个商品下各个供应商的贡献金额,然后筛选出每个商品金额最高的供应商:

# 按「商品+供应商」分组,计算每个供应商对该商品的总贡献金额
item_supplier_total = df.groupby(['item_code', 'supplier_code'], as_index=False)['dollar_amount'].sum()
# 对每个商品,按供应商贡献金额降序排序,取第一个(金额最高的供应商)
item_top_supplier = item_supplier_total.sort_values(by='dollar_amount', ascending=False)\
                                      .groupby('item_code').head(1)\
                                      .drop(columns='dollar_amount')

步骤4:合并结果得到最终表格

把Top商品的总金额和对应的供应商信息合并,调整列名匹配你期望的输出格式:

# 合并Top商品数据和对应供应商数据
final_result = pd.merge(top_items, item_top_supplier, on='item_code')
# 重命名列名,和你示例输出的格式对齐
final_result = final_result.rename(columns={'dollar_amount': 'TotalDollarAmount', 'supplier_code': 'SupplierCode'})
# 可选:把金额格式化为带千分位的字符串,和你示例输出一致
final_result['TotalDollarAmount'] = final_result['TotalDollarAmount'].apply(lambda x: f"{x:,.4f}")

print(final_result)

示例输出(基于你的测试数据)

当N=3时,输出会是:

item_code TotalDollarAmount SupplierCode
0     Item1        1,802.2500         Sup1
1     Item2        1,400.0000         Sup1
2     Item3          360.0000         Sup2

如果你的需求是取供应商供应该商品次数最多的,只需要把步骤3里的求和改成计数即可:将['dollar_amount'].sum()替换为['supplier_code'].count()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:01:59