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

将字典作为新列追加到pandas DataFrame时ix报错及loc无生效问题咨询

问题解决方法

问题根源

你遇到的问题由三个原因导致:

  • ix是pandas v0.20版本就废弃、v1.0之后完全移除的接口,所以运行旧教程代码会直接报属性不存在的错误,你替换为loc的思路是正确的
  • 替换后数据不更新的核心原因是:iterrows()返回的row是原DataFrame行的副本,你给副本新增列字段后直接整行赋值给data.loc[index]时,如果原DataFrame没有预先声明这两个新增列,pandas会自动忽略不存在的列字段,导致赋值不生效
  • 额外注意:原教程代码中赋值的目标对象是results,你自己的代码里用的是data,需要确认你最终输出的DataFrame和赋值的目标是同一个对象,避免赋值错变量

修复步骤

步骤1:预先初始化新增列

在运行循环之前,先给你的DataFrame创建两个空的新列,提前告诉pandas这两个列存在:

data['HomeLastWin'] = False
data['VisitorLastWin'] = False

步骤2:修改循环赋值逻辑

不需要修改row副本后整行赋值,直接给原DataFrame的对应位置赋值即可,逻辑更清晰、效率更高:

from collections import defaultdict
won_last = defaultdict(bool)

for index, row in data.iterrows():
    home_team = row['HomeTeam']
    visitor_team = row['AwayTeam']
    # 直接给原DataFrame对应行的指定列赋值
    data.loc[index, 'HomeLastWin'] = won_last[home_team]
    data.loc[index, 'VisitorLastWin'] = won_last[visitor_team]
    # 更新球队上一场胜负记录
    won_last[home_team] = row['HomeWin']
    won_last[visitor_team] = not row['HomeWin']

运行完上述代码后,data里就会有你需要的两个新列了。

补充说明

如果你的数据集行数超过10万条,iterrows()的运行效率会比较低,可以改用apply或者pandas的移位函数shift()实现相同逻辑,小数据集下上述方案足够使用。

内容的提问来源于stack exchange,提问作者JonH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:24:04