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

