将字典作为新列追加到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
相关产品推荐
相关产品推荐

