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

Python数据透视表无法正确计算供应商最大Aging Day问题

问题:数据透视表无法正确计算供应商的最大Aging Day

问题场景

编写的脚本生成的数据透视表无法正确计算最大Aging Day,例如供应商CELOVIS的最大Aging Day应为12,但实际得到结果为1。目前运单数量计算正确,但最大Aging Day计算结果错误。需求是在数据透视表中展示每个供应商的最大Aging Day及其运单编号数量。

错误原因分析

原代码中计算最大Aging Day的逻辑存在本质错误:

s = df.groupby(['Supplier Name','Aging Day']).size()
pivot_table = s.loc[s.groupby(level=0).idxmax()].reset_index().drop(0,axis=1)

这段代码是先统计每个供应商下不同Aging Day的出现次数,再取出现次数最多的Aging Day,而非数值最大的Aging Day。这就是CELOVIS的最大Aging Day被错误计算为1的核心原因——Aging Day=1的记录出现次数最多,但1并不是该供应商的最大Aging Day值。

修正后的代码

import pandas as pd

data = pd.read_csv("my_problem.csv")
def pivot_table(df):
    # 计算每个供应商的运单数量
    courier_count = df.groupby('Supplier Name').size().reset_index(name='Count of Tracking Number')
    
    # 计算每个供应商的最大Aging Day
    max_aging = df.groupby('Supplier Name')['Aging Day'].max().reset_index(name='Max Aging Day')
    
    # 合并两个结果集
    pivot_table = max_aging.merge(courier_count, on="Supplier Name", how="left")
    
    # 按最大Aging Day降序排序
    pivot_table.sort_values(by=["Max Aging Day"], ascending=[False], inplace=True)
    
    # 添加总计行
    grand_total = pd.DataFrame({
        'Supplier Name': ['Grand Total'],
        'Max Aging Day': [pivot_table['Max Aging Day'].max()],
        'Count of Tracking Number': [pivot_table['Count of Tracking Number'].sum()]
    })
    pivot_table = pd.concat([pivot_table, grand_total], ignore_index=True)
    
    return pivot_table

关键改动说明

  1. 核心逻辑修正:直接通过groupby('Supplier Name')['Aging Day'].max()获取每个供应商的Aging Day数值最大值,彻底解决原逻辑的错误。
  2. 代码简化优化:使用pandas原生的groupby.size()替代Counter计算运单数量,代码更简洁且符合pandas的惯用写法。
  3. 总计行生成优化:通过构造独立DataFrame的方式添加总计行,避免原代码中直接修改行可能出现的警告和潜在问题。

效果验证

修正后,供应商CELOVIS的Max Aging Day会正确显示为12,其他供应商的最大Aging Day均按数值最大值计算,同时运单数量统计保持正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:45:35