Pandas1.3.3执行pd.to_numeric赋值时报Columns must be same length as key错误
问题原因
这个报错是pandas 1.3.0~1.3.3版本的已知兼容性问题,该版本区间对多列赋值的校验逻辑做了变更,校验规则比1.2.x严格很多,甚至存在部分误判场景:即使左右两侧数据shape完全一致,只要右侧返回的DataFrame列名顺序、列名数据类型和左侧选择的列不完全匹配,就会触发该报错,而1.2.x版本会自动按列名对齐,不会触发校验失败。
你可以先执行以下代码验证是否属于列元数据不匹配的场景:
left_cols = self._df[cts.NUMERIC_COLS].columns right_cols = self._df[cts.NUMERIC_COLS].apply(pd.to_numeric, errors='coerce').columns # 检查列名是否完全相等 print(left_cols.equals(right_cols)) # 检查列顺序是否完全一致 print(list(left_cols) == list(right_cols)) # 检查列名的数据类型是否一致 print(left_cols.dtype == right_cols.dtype)
如果以上任意一个输出为False,即可确认是列元数据不匹配导致的问题。
解决方案
你可以任选以下一种方案解决问题:
- 方案1:显式对右侧结果按左侧列顺序重排,绕开校验逻辑
numeric_res = self._df[cts.NUMERIC_COLS].apply(pd.to_numeric, errors='coerce') self._df[cts.NUMERIC_COLS] = numeric_res.reindex(columns=cts.NUMERIC_COLS)
- 方案2:替换成逐列处理的写法,规避多列赋值的校验,性能也比apply更高
for col in cts.NUMERIC_COLS: self._df[col] = pd.to_numeric(self._df[col], errors='coerce')
- 方案3:升级pandas到1.3.4及以上版本,该版本已经修复了这个赋值校验的误判bug
内容的提问来源于stack exchange,提问作者Solar
相关产品推荐
相关产品推荐

