解决pandas中ValueError长度不匹配问题:保留前4列的代码修改
问题解决:修正长度不匹配错误并保留前4列
错误原因
你触发的ValueError是因为生成new_values的逻辑存在两个问题:一是循环过程中每次添加元素后就立刻转为DataFrame并设置列名,导致最终new_values的行数和原data的102行不匹配;二是部分行生成的年份列表长度不等于4,引发列名设置失败或后续拼接时的长度冲突。
修改后的完整代码
1. 修正new_values生成逻辑
min_year = data['Contract Start Year'].min() max_year = int(data['Contract End Year'].max()) + 1 new_values = [] for i in range(len(data)): # 去掉[],避免返回Series导致转int出错 start = int(data.loc[i, 'Contract Start Year']) try: end = int(data.loc[i, 'Contract End Year']) + 1 except ValueError: print("处理错误:合同结束年份无法转为整数") end = start # 出错时默认取起始年,防止后续崩溃 # 生成年份列表并仅保留前4个元素,不足4个的补空字符串 year_list = list(range(start, end))[:4] while len(year_list) < 4: year_list.append("") new_values.append(year_list) # 循环结束后统一转为DataFrame并设置列名,保证行数和data一致 new_values = pd.DataFrame(new_values, columns=['a', 'b', 'c', 'd'])
2. 年份拼接逻辑(保留原写法或用更简洁方式)
# 原写法保留 data['Years'] = new_values['a'].astype(str) + " " + new_values['b'].astype(str) + " " + new_values['c'].astype(str) + " " + new_values['d'].astype(str) # 可选:更简洁的拼接写法 data['Years'] = new_values.astype(str).agg(' '.join, axis=1)
关键修改点
- 将DataFrame转换和列名设置移到循环结束后,确保
new_values行数与data完全匹配 - 用
[:4]强制截取每个年份列表的前4个元素,不足的补空字符串,保证每行都有4个元素 - 修正
loc取值方式,避免返回Series导致转int出错 - 给异常处理添加默认值,防止出错时
end未定义引发新错误
内容的提问来源于stack exchange,提问作者sdg30
相关产品推荐
相关产品推荐

