如何实现按Location分组并聚合每组Top3 KG记录的总和
解决方案:按分组筛选TopN记录后聚合求和
我完全理解你的需求:按Location分组后,仅保留每组中KG值最高的前3条记录,再对这部分记录的KG和Dollars字段求和。用Python的pandas库可以轻松实现这个逻辑,下面分步骤给你拆解:
步骤1:准备测试数据集
先把你的原始数据转换成pandas DataFrame:
import pandas as pd # 构造原始数据 data = [ ["BKK", 7, 2], ["BKK", 5, 3], ["BKK", 4, 2], ["BKK", 3, 3], ["BKK", 2, 2], ["HKG", 8, 3], ["HKG", 6, 2], ["HKG", 4, 3], ["HKG", 3, 2], ["HKG", 2, 3], ] df = pd.DataFrame(data, columns=["Location", "KG", "Dollars"])
步骤2:筛选每组Top3的KG记录
这里有两种实现方式,分别适合不同规模的数据集:
方式一:适合小规模数据(直观易懂)
用groupby()结合apply(),在每个分组内按KG降序排序后取前3行:
# 分组后筛选每组Top3的KG记录 top3_df = df.groupby("Location").apply( lambda x: x.sort_values("KG", ascending=False).head(3) ).reset_index(drop=True)
执行后会得到每个Location下KG最高的3条记录:
Location KG Dollars 0 BKK 7 2 1 BKK 5 3 2 BKK 4 2 3 HKG 8 3 4 HKG 6 2 5 HKG 4 3
方式二:适合大规模数据(性能更优)
如果数据集很大,apply()的效率会偏低,推荐用rank()标记每组内的排名,再筛选排名≤3的记录:
# 给每组内的KG按降序排名(method="first"避免并列值重复排名) df["kg_rank"] = df.groupby("Location")["KG"].rank(ascending=False, method="first") # 筛选排名前3的记录 top3_df = df[df["kg_rank"] <= 3]
步骤3:对筛选后的结果聚合求和
最后按Location分组,对KG和Dollars字段求和:
result = top3_df.groupby("Location").agg({"KG": "sum", "Dollars": "sum"}).reset_index()
输出结果完全符合你的预期:
Location KG Dollars 0 BKK 16 7 1 HKG 18 8
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

