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
关键改动说明
- 核心逻辑修正:直接通过
groupby('Supplier Name')['Aging Day'].max()获取每个供应商的Aging Day数值最大值,彻底解决原逻辑的错误。 - 代码简化优化:使用pandas原生的
groupby.size()替代Counter计算运单数量,代码更简洁且符合pandas的惯用写法。 - 总计行生成优化:通过构造独立DataFrame的方式添加总计行,避免原代码中直接修改行可能出现的警告和潜在问题。
效果验证
修正后,供应商CELOVIS的Max Aging Day会正确显示为12,其他供应商的最大Aging Day均按数值最大值计算,同时运单数量统计保持正确。
内容的提问来源于stack exchange,提问作者PythonLearner
相关产品推荐
相关产品推荐

