解决Pandas中按参赛条件删DataFrame行的ValueError问题
解决Pandas中Series比较的ValueError问题
问题场景
需要删除ratings数据框中未参赛球队的行(球队未出现在fixtures的HomeTeam或AwayTeam列),原代码运行报错:
fixtures = pd.DataFrame({'HomeTeam': ["Team1", "Team3", "Team5", "Team6"], 'AwayTeam': [ "Team2", "Team4", "Team6", "Team8"]}) ratings = pd.DataFrame({'team': ["Team1", "Team2", "Team3", "Team4", "Team5", "Team6", "Team7", "Team8", "Team9", "Team10", "Team11", "Team12"], "rating": ["1,5", "0,2", "0,5", "2", "3", "4,8", "0,9", "-0,4", "-0,6", "1,5", "0,2", "0,5"]}) ratings = ratings[(ratings.team != fixtures.HomeTeam) & (ratings.team != fixtures.AwayTeam)]
错误信息:
ValueError: Can only compare identically-labeled Series objects
错误原因
直接用ratings.team != fixtures.HomeTeam这类方式比较两个Series时,Pandas要求两个Series必须标签完全匹配、长度一致。但这里ratings.team长度为12,fixtures.HomeTeam长度为4,无法完成逐元素的匹配对比,因此触发ValueError。
正确解决方法
先收集所有参赛球队的集合,再用isin()方法筛选符合条件的行:
# 合并主场和客场球队,去重得到所有参赛球队 participating_teams = pd.concat([fixtures.HomeTeam, fixtures.AwayTeam]).unique() # 保留ratings中属于参赛球队的行(删除未参赛球队) ratings = ratings[ratings.team.isin(participating_teams)]
执行后,ratings将仅保留Team1至Team8的记录,Team9至Team12这些未参赛球队会被移除。
如果需要直接筛选未参赛球队(即删除参赛的),可以用~取反:
ratings = ratings[~ratings.team.isin(participating_teams)]
内容的提问来源于stack exchange,提问作者Robin Reiche
相关产品推荐
相关产品推荐

