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

Python映射星期到数字:遍历DataFrame生成DOW列全为空问题

故障原因

核心问题是你使用了链式索引赋值,这是pandas赋值时的经典错误:

  • 你写的inputData.iloc[i]['DOW'] = 数字属于连续两次独立索引操作:先通过iloc[i]取第i行,再在这行对象上取DOW列赋值。pandas无法保证这种链式操作返回的是原DataFrame的视图,绝大多数场景下你拿到的是行数据的临时副本,所有赋值操作都只修改了这个临时副本,临时对象在代码行执行完就会被内存回收,根本没有写入到原DataFrame中。
  • 额外的小问题:你初始化DOW列时赋值为空字符串,把整列类型固定成了字符串类型,后续赋整数值本身也会触发类型适配问题,但不是导致全列空值的核心原因。
  • 运行这段代码时pandas其实会抛出SettingWithCopyWarning警告,提示你正在尝试给副本赋值,只是你大概率忽略了这个警告。
正确实现方案

pandas做这类固定值映射不需要写逐行循环,用内置映射方法性能比循环高几十到上百倍,也不会触发链式索引问题:

# 先定义星期到数字的映射字典
dow_mapping = {
    "Sunday": 1,
    "Monday": 2,
    "Tuesday": 3,
    "Wednesday": 4,
    "Thursday": 5,
    "Friday": 6,
    "Saturday": 7
}

# 场景1:day_of_the_week列是精确的星期字符串(比如值就是"Monday"),直接map映射
inputData["DOW"] = inputData["day_of_the_week"].map(dow_mapping)

# 场景2:day_of_the_week列是包含星期的长文本(比如"Week 2, Monday"),先提取关键词再映射
import re
match_pattern = re.compile("|".join(dow_mapping.keys()))
inputData["DOW"] = inputData["day_of_the_week"].str.extract(f"({match_pattern})")[0].map(dow_mapping)

如果你非要保留逐行循环的写法,必须用单次loc索引定位到原表单元格赋值,不要用链式索引:

# 注:逐行写法性能极差,仅做错误修正演示,不推荐实际使用
import pandas as pd
inputData["DOW"] = pd.Series(dtype="int") # 初始化为整数类型列
for i in range(len(inputData)):
    day_content = inputData.loc[i, "day_of_the_week"]
    if "Sunday" in day_content:
        inputData.loc[i, "DOW"] = 1
    elif "Monday" in day_content:
        inputData.loc[i, "DOW"] = 2
    elif "Tuesday" in day_content:
        inputData.loc[i, "DOW"] = 3
    elif "Wednesday" in day_content:
        inputData.loc[i, "DOW"] = 4
    elif "Thursday" in day_content:
        inputData.loc[i, "DOW"] = 5
    elif "Friday" in day_content:
        inputData.loc[i, "DOW"] = 6
    elif "Saturday" in day_content:
        inputData.loc[i, "DOW"] = 7

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:45:36