Pandas中根据Location列值提取Left/Right列整数至Barcelona_result列问题
问题分析与解决办法
原代码的问题
- 语法错误:
for i in df['Location']末尾缺少冒号,代码无法正常运行 - 逻辑完全错误:你遍历
Location的每个值,但每次操作都是对整个Barcelona_result列做累加,而非针对当前行。再加上代码里的break,循环只会执行一次——如果第一行是主场,就给所有行的结果加上Left列的值,然后直接终止循环,客场的行根本没机会处理;如果第一行是客场,就加Right后终止,结果全错。 - 缩进错误:
break的缩进位置不对,导致它必然在第一次循环后执行,直接终止循环。
正确的实现方式
Pandas推荐用向量化操作代替逐行循环,既高效又不易出错,以下是几种可行方案:
方案1:用np.where(最简洁高效)
import numpy as np df['Barcelona_result'] = np.where(df['Location'] == 'Home', df['Left'], df['Right'])
这个方法会逐行判断Location的值,对应取Left或Right列的数值,直接生成目标列。
方案2:用loc索引赋值
# 先初始化列 df['Barcelona_result'] = 0 # 给主场行赋值 df.loc[df['Location'] == 'Home', 'Barcelona_result'] = df['Left'] # 给客场行赋值 df.loc[df['Location'] == 'Away', 'Barcelona_result'] = df['Right']
通过loc精准定位主客场的行,分别赋值对应的进球数。
方案3:用apply(适合复杂逻辑场景)
如果之后有更复杂的判断逻辑,可以用apply逐行处理:
df['Barcelona_result'] = df.apply(lambda row: row['Left'] if row['Location'] == 'Home' else row['Right'], axis=1)
不过这种方法效率比前两种低,数据量大时不推荐。
内容的提问来源于stack exchange,提问作者user20998152
相关产品推荐
相关产品推荐

