
本文介绍如何使用 pandas 对销售数据按日期和商品分组,快速识别同一商品在不同地区的成本差异,并直接计算各条记录与当日该商品最高价的差值。
本文介绍如何使用 pandas 对销售数据按日期和商品分组,快速识别同一商品在不同地区的成本差异,并直接计算各条记录与当日该商品最高价的差值。
在实际业务分析中(如分销定价监控),常需验证「同一商品在同一天是否于不同地区执行统一售价」。若存在价格不一致,还需量化差异程度。Pandas 提供了高效、向量化的方法来实现这一目标——无需循环或手动聚合,仅需结合 groupby 与 transform 即可完成。
核心思路是:以 ['Date', 'item'] 为分组键,对 cost 列计算每组的最大值(即当日该商品的最高售价),再用该最大值减去每行的实际 cost,得到“距最高价的差额”。该差额为 0 表示该条记录已是当日最高价;正值则表示存在价格差异,数值越大说明该地售价越低(相对最高价而言)。
以下是完整实现代码:
import pandas as pd
# 构建示例数据
df = pd.DataFrame({
'distributor': ['GEC']*9,
'Location': ['KA','TN','AP','KA','TN','AP','KA','TN','AP'],
'Date': ['2025-02-01']*3 + ['2025-02-02']*3 + ['2025-02-03']*3,
'item': ['Apple','Apple','Apple','Orange','Orange','Orange','Banana','Banana','Banana'],
'cost': [10.0, 10.0, 9.0, 8.0, 7.0, 8.5, 6.0, 6.0, 6.0]
})
# 计算每组(Date+item)内 cost 相对于组内最大值的差额
df = df.assign(difference=df.groupby(['Date', 'item'])['cost'].transform('max') - df['cost'])
print(df)
输出结果将新增 difference 列,清晰标出每条记录的价格偏离程度:
distributor Location Date item cost difference 0 GEC KA 2025-02-01 Apple 10.0 0.0 1 GEC TN 2025-02-01 Apple 10.0 0.0 2 GEC AP 2025-02-01 Apple 9.0 1.0 3 GEC KA 2025-02-02 Orange 8.0 0.5 4 GEC TN 2025-02-02 Orange 7.0 1.5 5 GEC AP 2025-02-02 Orange 8.5 0.0 6 GEC KA 2025-02-03 Banana 6.0 0.0 7 GEC TN 2025-02-03 Banana 6.0 0.0 8 GEC AP 2025-02-03 Banana 6.0 0.0
✅ 关键优势:
-
transform('max')保证返回与原 DataFrame 等长的 Series,天然对齐,避免索引错位; -
assign()方法链式安全,不修改原数据,利于调试与复用; - 可轻松扩展:将
'max'替换为'min'、'mean'或自定义函数(如lambda x: x.max() - x.min()获取组内极差)。
⚠️ 注意事项:
- 若需判断「是否存在价格差异」,可进一步添加布尔列:
df['has_variation'] = df.groupby(['Date', 'item'])['cost'].transform('nunique') > 1; - 日期列建议先转为
datetime类型(df['Date'] = pd.to_datetime(df['Date'])),便于后续按周/月聚合; - 多级分组(如增加
distributor)只需扩展groupby键列表,逻辑完全一致。
通过这一方法,你不仅能快速定位异常定价点,还能为自动化价格合规检查提供结构化指标。










