基于DataFrame列值填充winner_id列的Python数据分析问题
问题分析与解决方案
错误原因
你遇到的核心问题是直接赋值整个列会覆盖原有数据:
第一次执行results['winner_id'] = results.loc[results['home_score'] > results['away_score'],'home_team']时,只有主队获胜的行被填充了有效值,其余行都是NaN;但第二次执行results['winner_id'] = results.loc[results['home_score'] < results['away_score'],'away_team']时,是把整个winner_id列替换成客队获胜行的取值,其他行自动变成NaN,自然就把之前主队获胜的有效数据覆盖了。
解决方案
以下是几种可行的修正方法,按需选择:
方法1:分步精准赋值(推荐,直观易维护)
先初始化空列,再用.loc定位符合条件的行单独赋值,不会覆盖已有数据:
# 先初始化空列 results['winner_id'] = None # 填充主队获胜的情况 results.loc[results['home_score'] > results['away_score'], 'winner_id'] = results['home_team'] # 填充客队获胜的情况 results.loc[results['home_score'] < results['away_score'], 'winner_id'] = results['away_team'] # 可选:处理平局场景,比如设置为'平局'或其他标识 results.loc[results['home_score'] == results['away_score'], 'winner_id'] = '平局'
方法2:用numpy.where一次性处理逻辑
适合逻辑简单的场景,一行代码搞定三种情况:
import numpy as np results['winner_id'] = np.where( results['home_score'] > results['away_score'], results['home_team'], np.where( results['home_score'] < results['away_score'], results['away_team'], '平局' # 平局时的取值,可根据需求修改 ) )
方法3:用apply逐行判断
如果后续需要更复杂的获胜判定逻辑,可使用此方法:
def get_winner(row): if row['home_score'] > row['away_score']: return row['home_team'] elif row['home_score'] < row['away_score']: return row['away_team'] else: return '平局' results['winner_id'] = results.apply(get_winner, axis=1)
内容的提问来源于stack exchange,提问作者hpelnaggar
相关产品推荐
相关产品推荐

