
本文介绍使用 pandas 按日期和商品分组,快速识别同一商品在不同地区是否存在价格差异,并计算各地区相对于当日最高价的差值。
本文介绍使用 pandas 按日期和商品分组,快速识别同一商品在不同地区是否存在价格差异,并计算各地区相对于当日最高价的差值。
在零售、分销或供应链分析中,常需监控商品定价一致性——例如,某日某商品(如 Apple)在多个销售区域(KA、TN、AP)是否执行统一售价。若存在价差,还需量化差异程度(如“AP 比 KA 低 1.0 元”)。Pandas 提供了高效、向量化的方法解决该问题,无需循环或复杂合并。
核心思路是:以 Date 和 item 为组合键进行分组,对每组内的 cost 计算极差信息(如最大值),再与原始成本做差,得到每个记录相对于组内最高价的偏离量。
以下为完整实现步骤:
✅ 步骤 1:构造示例数据
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]
})✅ 步骤 2:计算“相对于当日同品最高价的差值”
df = df.assign(
difference=df.groupby(['Date', 'item'])['cost'].transform('max') - df['cost']
)该语句含义:
-
groupby(['Date', 'item'])将数据按日期+商品精细分组(如'2025-02-01' + 'Apple'为一组); -
.transform('max')对每组cost求最大值,并广播回原索引长度,确保结果与原始 DataFrame 行数对齐; - 最后用该最大值减去原始
cost,即得每条记录的“降价幅度”(若为 0,说明该地为当日最高价;若为正数,说明低于最高价)。
运行后输出如下:
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
? 进阶洞察:快速识别存在价差的商品日
若只需标记“哪些 (Date, item) 组存在价格不一致”,可进一步聚合:
price_varies = df.groupby(['Date', 'item'])['cost'].agg(['min', 'max']).query('min != max')
print(price_varies)输出将仅显示有差异的组(如 Apple 和 Orange),便于运营人员聚焦核查。
⚠️ 注意事项
-
transform是关键:它保留原始索引结构,避免agg导致的维度坍缩; - 若需“绝对差异范围”(如最大–最小),可用
df.groupby(['Date','item'])['cost'].agg(lambda x: x.max() - x.min()); - 确保
Date列为datetime类型(可用pd.to_datetime(df['Date'])转换),便于后续时间序列分析; - 多级分组(如增加
distributor)可扩展至跨渠道比价场景。
通过这一简洁而强大的链式操作,你不仅能秒级识别定价异常,还能直接量化偏差,为价格合规审计与动态调价提供可靠数据基础。

















