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

pandas for循环搭配if修改列值结果错误如何解决

问题原因

你的代码出现错位赋值有两个核心问题:

  • 索引错位:你使用enumerate()遍历df_dummy['Days']时,生成的计数值是从0开始的遍历位置序号,不是DataFrame实际的行标签。从你的输出可以看到,当前DataFrame的行索引从2开始,当遍历到2022-08-15所在行时,enumerate生成的计数值是45,而DataFrame中行标签为45对应的日期是2022-08-11,因此值被错误修改到了这一行。
  • 链式索引风险:你使用的df_dummy['Vacations_per_day'][index]是pandas官方明确不推荐的链式索引写法,这种写法无法保证赋值操作作用在原DataFrame上,经常出现赋值不生效、误赋值的问题,还会触发SettingWithCopyWarning警告。
解决方案

pandas处理这类批量条件赋值不要用逐行循环,直接使用向量化操作即可,逻辑可靠、运行效率更高:

legal_days = ['2022-08-15', '2022-11-30', '2022-12-01', '2022-12-26']
# 匹配Days列属于legal_days的行,将对应Vacations_per_day列设为4
df_dummy.loc[df_dummy['Days'].isin(legal_days), 'Vacations_per_day'] = 4

代码逻辑说明:

  • 用.isin(legal_days)批量判断Days列每个值是否属于法定日期列表,返回布尔型的行筛选掩码
  • 用.loc同时定位符合条件的行、需要修改的Vacations_per_day列,直接完成赋值,从语法层面避免索引错位和链式索引的问题。

如果你一定要保留循环写法(性能远低于向量化操作,不推荐),需要通过DataFrame原生方法取真实行索引,禁止用enumerate生成的序号作为行标签赋值:

for idx, row in df_dummy.iterrows():
    if row['Days'] in legal_days:
        df_dummy.loc[idx, 'Vacations_per_day'] = 4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 18:21:52