使用if-else创建DataFrame的Winner列时结果异常问题求助
问题原因
你这段代码的核心问题出在循环赋值逻辑上:每次判断后,你直接把整列数据(比如df['Home_team'])赋值给df['Winner'],而非仅更新当前行的Winner字段。循环执行到最后一次时,最后一行的Average为1(3-2),满足e>0的条件,于是整个Winner列被替换成Home_team列的内容,最终导致所有行都显示主队。
修复方案
以下是几种简洁且正确的写法,推荐优先用pandas原生的向量化操作,效率更高:
方案1:用np.where链式判断(推荐,最符合pandas风格)
无需循环和中间列,一行代码直接生成结果:
import pandas as pd import numpy as np A = ['A', '1', 'D', '2'] B = ['B', '2', 'E', '2'] C = ['C', '3', 'F', '2'] df = pd.DataFrame(np.array([A,B,C]), columns = ['Home_team', 'Home_team_goal', 'Away_team', 'Away_team_goal']) df['Home_team_goal'] = pd.to_numeric(df['Home_team_goal']) df['Away_team_goal'] = pd.to_numeric(df['Away_team_goal']) # 直接根据进球数判断生成Winner列 df['Winner'] = np.where(df['Home_team_goal'] > df['Away_team_goal'], df['Home_team'], np.where(df['Home_team_goal'] < df['Away_team_goal'], df['Away_team'], 'Tie'))
方案2:修复原循环的赋值逻辑
如果坚持用循环,需要通过.loc定位到当前行的Winner字段进行赋值:
import pandas as pd import numpy as np A = ['A', '1', 'D', '2'] B = ['B', '2', 'E', '2'] C = ['C', '3', 'F', '2'] df = pd.DataFrame(np.array([A,B,C]), columns = ['Home_team', 'Home_team_goal', 'Away_team', 'Away_team_goal']) df['Home_team_goal'] = pd.to_numeric(df['Home_team_goal']) df['Away_team_goal'] = pd.to_numeric(df['Away_team_goal']) df['Average'] = df['Home_team_goal'] - df['Away_team_goal'] df['Winner'] = '' for i, e in enumerate(df['Average']): if e > 0: df.loc[i, 'Winner'] = df.loc[i, 'Home_team'] # 仅更新当前行 elif e < 0: df.loc[i, 'Winner'] = df.loc[i, 'Away_team'] else: df.loc[i, 'Winner'] = 'Tie'
方案3:用apply函数逐行处理
通过自定义函数,逐行判断并返回结果:
import pandas as pd import numpy as np A = ['A', '1', 'D', '2'] B = ['B', '2', 'E', '2'] C = ['C', '3', 'F', '2'] df = pd.DataFrame(np.array([A,B,C]), columns = ['Home_team', 'Home_team_goal', 'Away_team', 'Away_team_goal']) df['Home_team_goal'] = pd.to_numeric(df['Home_team_goal']) df['Away_team_goal'] = pd.to_numeric(df['Away_team_goal']) def get_winner(row): if row['Home_team_goal'] > row['Away_team_goal']: return row['Home_team'] elif row['Home_team_goal'] < row['Away_team_goal']: return row['Away_team'] else: return 'Tie' df['Winner'] = df.apply(get_winner, axis=1)
运行后Winner列会正确显示:第一行A,第二行Tie,第三行C。
内容的提问来源于stack exchange,提问作者spearrow
相关产品推荐
相关产品推荐

