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

按客户和品类计算月度金额差异的Python代码问题排查

问题:按客户+品类计算月度金额差异时首次出现品类的差异值错误

需要基于DataFrame按**客户(Name)和品类(Category)**计算月度金额(Amount)的差异,但当前代码存在问题:当客户首次出现某品类时,差异列(如第4行的DiffA)显示为0,而非正确的金额值1782207。推测原因是该客户上月无此品类数据导致代码失效。

原始代码:

df.sort_values(by=['Name','Category','Date'], inplace=True)
df['DiffB'] = df[df['Category'] == B].groupby('Name')['amount'].diff().fillna(0)
df['DiffA'] = df[df['Category'] == A].groupby('Name')['amount'].diff().fillna(0)

修复方案

问题根源

  1. 原代码仅按Name分组,未将Category纳入分组键,导致不同品类的月度数据被混在一起计算差异
  2. 首次出现的品类数据用fillna(0)直接替换了diff()返回的NaN,但实际首次出现的差异应等于当期金额(相当于从0到当期值的变化)

修复代码(推荐写法)

# 确保数据按客户、品类、日期排序
df.sort_values(by=['Name', 'Category', 'Date'], inplace=True)

# 按客户+品类分组计算差异,首次出现的行用当期金额填充
df['Diff'] = df.groupby(['Name', 'Category'])['amount'].diff()
df['Diff'] = df['Diff'].fillna(df['amount'])

# 拆分出对应品类的差异列
df['DiffA'] = df['Diff'].where(df['Category'] == 'A', 0)
df['DiffB'] = df['Diff'].where(df['Category'] == 'B', 0)

另一种拆分处理的写法

如果需要单独处理每个品类的差异列:

df.sort_values(by=['Name','Category','Date'], inplace=True)

# 按客户+品类分组,首次出现时用当期金额填充差异
df['DiffA'] = df[df['Category'] == 'A'].groupby(['Name', 'Category'])['amount'].diff().fillna(df[df['Category'] == 'A']['amount'])
df['DiffB'] = df[df['Category'] == 'B'].groupby(['Name', 'Category'])['amount'].diff().fillna(df[df['Category'] == 'B']['amount'])

# 未匹配品类的行填充为0
df[['DiffA', 'DiffB']] = df[['DiffA', 'DiffB']].fillna(0)

关键修改点

  • 分组键改为['Name', 'Category'],保证每个客户的每个品类独立计算月度差异
  • 首次出现的品类数据,用当期amount替代NaN,而非填充0,符合业务逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:50:56