You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:26:10