Pandas如何用groupby transform实现排名 替代groupby rank+merge方案
以下两种实现方式均可达到你要求的效果,性能优于你当前使用的merge方案:
方案1:map映射实现(性能最优,写法最简洁)
直接构造id与rank的映射关系,再赋值到原表,无需合并操作:
import pandas as pd data = { "id": [1,1,2,2,3,3,4,4,5,5], "value": [10,10,20,20,30,30,40,40,20,20] } df = pd.DataFrame(data) # 生成id到rank的映射 id_rank_map = df.drop_duplicates("id").set_index("id")["value"].rank(method="first", ascending=False) df["rank"] = df["id"].map(id_rank_map)
方案2:groupby.transform实现(符合你指定的transform语法要求)
# 仅给每个id的首行计算rank,再按id分组广播到所有同id行 first_id_mask = ~df["id"].duplicated() df.loc[first_id_mask, "rank"] = df.loc[first_id_mask, "value"].rank(method="first", ascending=False) df["rank"] = df.groupby("id")["rank"].transform("first")
两种方案的输出和你原有代码的输出完全一致,且避免了merge操作带来的额外内存开销,数据量越大性能优势越明显。
内容的提问来源于stack exchange,提问作者Raymond Toh
相关产品推荐
相关产品推荐

