如何在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
相关产品推荐
相关产品推荐

