Pandas DataFrame重复运行Season字段转换代码报ValueError原因查询
错误原因分析
该错误的核心诱因是两次运行代码时Season列的数据格式发生了变化,导致loc赋值时左右两侧筛选结果的长度不匹配,具体逻辑如下:
- 首次运行时,初始的Season列是6位数字格式,转为字符串后长度统一为6。每个赋值语句的左侧loc筛选条件同时满足「后两位符合季度编码规则」+「字符串长度等于6」,右侧仅按「后两位符合季度编码规则」筛选,两者匹配到的行数完全相等,赋值逻辑正常执行,最终Season被转为
季度名称 + 年份的文本格式。 - 首次运行结束后,Season列的值已经变成类似
Summer 2021的文本,字符串长度远大于6。第二次运行相同代码时:- 左侧loc筛选因为加入了
str.len() == 6的限制,没有匹配到任何行,返回长度为0的空序列 - 右侧的筛选没有加长度限制,部分符合后两位规则的行会被命中,返回的序列长度大于0
- 左侧loc筛选因为加入了
- Pandas要求loc赋值操作的左右两侧序列长度必须一致,空序列和非空序列长度不匹配,因此抛出对应报错。
优化方案
可以提前统一筛选逻辑,或使用映射规则避免重复执行报错,参考代码如下:
# 定义季度编码映射关系 season_map = { '11': 'Spring', '12': 'Summer', '21': 'Autumn', '22': 'Holiday' } # 仅对还未转换的6位格式Season做处理 convert_mask = df['Season'].astype(str).str.len() == 6 df.loc[convert_mask, 'Season'] = df.loc[convert_mask, 'Season'].astype(str).apply( lambda x: f"{season_map[x[-2:]]} {x[:4]}" )
内容的提问来源于stack exchange,提问作者wwh
相关产品推荐
相关产品推荐

