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
相关产品推荐
相关产品推荐

