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

如何在Python DataFrame中获取各产品最新日期的平均价格?

解决DataFrame获取各产品最新日期均价的问题

你需要处理包含productId、date、price三列的DataFrame,目标是每个产品取最新日期的价格,若同一产品在最新日期有多个价格则计算均值。

示例数据

import pandas as pd
data = {"productId":[1,2,1,2,3],
        "date":["2021-01-02","2021-01-02","2021-01-02","2021-01-03","2021-01-03"],
        "price":[12.0,11.3,11.0,9.8,8.7]}
df = pd.DataFrame(data)

原代码报错原因

你之前的代码抛出Can only compare identically-labeled Series objects异常,是因为:

  • df["date"]是原DataFrame的列,索引为原始行号
  • latest_price = df.groupby("productId")["date"].max()得到的是分组后的Series,索引为productId
    两者索引不匹配,直接用==比较会导致维度不兼容的错误。

正确实现方法

方法一:分组取最新日期 + 合并筛选 + 聚合均值

这种方法逻辑清晰,适合新手理解:

# 1. 获取每个产品的最新日期,转为带productId的DataFrame
latest_dates = df.groupby("productId")["date"].max().reset_index()
# 2. 合并原DataFrame,只保留日期匹配的记录
filtered_df = df.merge(latest_dates, on=["productId", "date"], how="inner")
# 3. 按产品分组计算均价
result = filtered_df.groupby("productId")["price"].mean().reset_index()

print(result)

输出结果:

productId  price
0          1   11.5
1          2    9.8
2          3    8.7

方法二:用transform标记最新日期(推荐)

利用transform方法让每个行都带上所属产品的最新日期,索引完全匹配,避免合并操作:

# 给每行添加对应产品的最新日期列
df["latest_date"] = df.groupby("productId")["date"].transform("max")
# 筛选出日期等于最新日期的记录
filtered_df = df[df["date"] == df["latest_date"]]
# 分组计算均价
result = filtered_df.groupby("productId")["price"].mean().reset_index()

方法三:用rank窗口函数筛选

通过对日期降序排名,取排名第一的记录(即最新日期):

# 按产品分组,对日期降序排名,dense保证相同日期排名一致
df["date_rank"] = df.groupby("productId")["date"].rank(ascending=False, method="dense")
# 筛选排名为1的记录(最新日期)
filtered_df = df[df["date_rank"] == 1]
# 计算均价
result = filtered_df.groupby("productId")["price"].mean().reset_index()

说明

  • 方法二代码最简洁,无需额外合并操作,性能更优
  • 方法三适合需要对日期做更复杂排序筛选的场景
  • 所有方法最终都能得到每个产品最新日期的价格均值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:22:39