遍历列表更新Pandas DataFrame列值被覆盖如何解决
问题原因
你的代码逻辑从根上就错了:
- 每次调用
home_or_away时都会全量重写home_or_away整列的值:只要当前遍历的队伍不是该行的主队,就直接把值设为0 - 循环遍历主队列表时,后一次运行会完全覆盖前一次生成的所有标记,最终只有最后一个被遍历到的主队对应的行能正确标1,其余所有行的标记都会被错误刷成0
- 主客场判断是行级逻辑,根本不需要遍历所有主队做逐队匹配,循环操作完全多余。
正确实现
根据你的数据集结构选对应方案即可:
情况1:原始表是每场比赛占一行的宽表,包含home_team(主队)、away_team(客队)字段
这种结构没法直接在原表加单一主客场列(每场对应两支参赛队),需要先转成每支球队单场占一行的长表,同步生成主客场标记:
import pandas as pd import numpy as np # 宽表转长表,保留其余赛事字段 df_long = df.melt( id_vars=[c for c in df.columns if c not in ["home_team", "away_team"]], value_name="team", var_name="tmp_type" ) # 生成主客场标记:来源为主队列记1,客队列记0 df_long["home_or_away"] = np.where(df_long["tmp_type"] == "home_team", 1, 0) df_long = df_long.drop(columns=["tmp_type"])
处理完的df_long每一行对应一支球队的单场参赛记录,home_or_away列就是你需要的标记。
情况2:已经是每支球队单场占一行的长表,包含home_team(该场主队名)、team(当前行对应参赛球队名)字段
不需要写循环、不需要自定义函数,一行代码直接按行判断生成结果即可:
import numpy as np df["home_or_away"] = np.where(df["team"] == df["home_team"], 1, 0)
注:如果你的参赛球队列名不是
team,把代码里的team替换成你表里实际的球队列名就行。
内容的提问来源于stack exchange,提问作者johndoe1839
相关产品推荐
相关产品推荐

