Pandas实现按最低得分者排序分组球队及生成摘要需求
没问题!我帮你梳理下实现思路,并用两种常用方式来实现——原生Python(无依赖)和Pandas(适合大数据场景),你可以根据自己的需求选择:
首先明确核心逻辑:
- 分组绑定:同队球员必须始终在一起
- 整体排序依据:按各队的最低得分从小到大排列球队顺序
- 队内排序:同队球员可按得分从低到高排列(可选,也可保留原顺序)
- 摘要生成:提取每个队的最低得分球员,顺序与排序后的球队一致
方案一:原生Python实现(无第三方库依赖)
适合小数据集,不需要额外安装库:
from itertools import groupby # 示例数据集 players = [ {"name": "张三", "team": "火箭队", "score": 85}, {"name": "李四", "team": "湖人队", "score": 72}, {"name": "王五", "team": "火箭队", "score": 68}, {"name": "赵六", "team": "湖人队", "score": 78}, {"name": "孙七", "team": "勇士队", "score": 65}, {"name": "周八", "team": "勇士队", "score": 70}, ] # 步骤1:按球队分组(groupby要求先按分组键排序) players_by_team = sorted(players, key=lambda x: x["team"]) team_groups = groupby(players_by_team, key=lambda x: x["team"]) # 步骤2:收集每个球队的核心信息 team_details = [] for team_name, group in team_groups: player_list = list(group) team_min_score = min(p["score"] for p in player_list) # 队内按得分升序排序(不需要的话直接用player_list即可) sorted_players = sorted(player_list, key=lambda x: x["score"]) team_details.append({ "team": team_name, "min_score": team_min_score, "players": sorted_players }) # 步骤3:按各队最低分对球队排序 sorted_teams = sorted(team_details, key=lambda x: x["min_score"]) # 步骤4:拼接最终的球员排序结果 final_sorted_players = [] for team in sorted_teams: final_sorted_players.extend(team["players"]) # 步骤5:生成各队最低分球员摘要 min_score_players_summary = [ next(p for p in team["players"] if p["score"] == team["min_score"]) for team in sorted_teams ] # 打印结果 print("✅ 排序后的球员列表:") for p in final_sorted_players: print(f"{p['name']} | {p['team']} | 得分:{p['score']}") print("\n📌 各队最低分球员摘要:") for p in min_score_players_summary: print(f"{p['name']} | {p['team']} | 最低得分:{p['score']}")
方案二:Pandas实现(适合大数据集)
如果你的数据集较大,用Pandas会更高效简洁:
import pandas as pd # 示例数据集 players = [ {"name": "张三", "team": "火箭队", "score": 85}, {"name": "李四", "team": "湖人队", "score": 72}, {"name": "王五", "team": "火箭队", "score": 68}, {"name": "赵六", "team": "湖人队", "score": 78}, {"name": "孙七", "team": "勇士队", "score": 65}, {"name": "周八", "team": "勇士队", "score": 70}, ] # 转换为DataFrame格式 df = pd.DataFrame(players) # 为每行添加所属球队的最低分(方便排序) df["team_min_score"] = df.groupby("team")["score"].transform("min") # 排序逻辑:先按球队最低分升序,再按球队(保证同队绑定),最后按球员得分升序 final_sorted_df = df.sort_values(by=["team_min_score", "team", "score"]) # 生成摘要:去重保留每个队的第一个(即最低分球员) summary_df = final_sorted_df.drop_duplicates(subset=["team"], keep="first") # 输出结果 print("✅ 排序后的球员列表:") print(final_sorted_df[["name", "team", "score"]].to_string(index=False)) print("\n📌 各队最低分球员摘要:") print(summary_df[["name", "team", "score"]].to_string(index=False))
关键说明
- 如果不需要队内按得分排序,直接去掉代码中对队内球员排序的部分即可
- 如果一个队有多个球员同分最低分,两种方案默认都会取第一个遇到的球员,你可以根据需求调整逻辑(比如保留所有最低分球员)
内容的提问来源于stack exchange,提问作者Anon Anonon
相关产品推荐
相关产品推荐

