如何获取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
相关产品推荐
相关产品推荐

