Python足球球员相似性查询:解决重复数据报错问题
解决重复球员姓名查询问题的修正代码
针对你遇到的跨赛季重名球员报错问题,以下是修正后的代码及关键逻辑说明:
import pandas as pd # 获取用户输入 player_name = input('Enter the player name you want to compare: ') target_season = input('Enter the season: ') # 1. 验证输入的球员是否存在于目标赛季中 player_in_season = df5[(df5['name'] == player_name) & (df5['season'] == target_season)] if player_in_season.empty: print(f"Error: Player {player_name} not found in season {target_season}") exit() # 2. 获取相似度数据并合并目标赛季的球员信息 # 提取目标球员的相似度排序结果 sim_scores = sim_matrix[player_name].reset_index().sort_values(by=player_name, ascending=False) # 合并时仅保留目标赛季的球员,避免跨赛季重名干扰 sim_players = pd.merge( sim_scores, df5[(df5['season'] == target_season)][['name', 'clusters', 'season']], on=['name'], how='inner' ).rename( columns={player_name: f"{player_name} - Euclidean Similarity %", "name": "Player name", "season": "Season"} ).head(30) # 3. 排除查询的球员本身 sim_players = sim_players[sim_players['Player name'] != player_name] # 输出结果 print(sim_players)
核心修正逻辑:
- 锁定球员-赛季组合:先验证输入球员是否存在于指定赛季,避免无效查询,同时明确我们只处理该赛季的球员数据。
- 合并前过滤赛季:在合并相似度数据与球员信息前,先将
df5过滤到目标赛季,再用inner join确保结果仅包含该赛季的球员,彻底规避跨赛季重名带来的重复数据问题。 - 替换错误逻辑:删除原代码中无效的
column.join(df5)语句,改用正确的DataFrame布尔索引实现过滤。
进阶优化建议:
如果你的数据集有唯一标识(比如player_id或name_season组合列),可以直接用唯一标识查询相似度矩阵,从根源上消除重名歧义:
# 假设df5中有唯一标识列name_season(格式如"PlayerName_2022/23") player_unique_id = player_in_season['name_season'].iloc[0] sim_scores = sim_matrix[player_unique_id].reset_index().sort_values(by=player_unique_id, ascending=False)
内容的提问来源于stack exchange,提问作者oscarstanley
相关产品推荐
相关产品推荐

