Pandas报错‘Columns must be same length as key’的排查求助
解决Pandas报错“Columns must be same length as key”
报错核心原因
这个错误的本质是:你试图将拆分后的数据赋值给['btts_x_1', 'btts_x_2']这类双列,但btts_x或btts_y列中存在部分单元格,用\n拆分后得到的元素数量不是2。常见情况包括:
- 单元格内容没有换行符,拆分后仅1个元素
- 单元格是空字符串/空值,拆分后得到空列表
- 单元格包含多个换行符,拆分后得到3个及以上元素
排查与解决步骤
1. 定位问题数据
先找出哪些行的内容不符合预期格式:
# 检查btts_x列拆分后的元素数量 frame['split_len_x'] = frame['btts_x'].apply(lambda x: len(x.split('\n'))) # 打印拆分长度不等于2的行内容 print(frame[frame['split_len_x'] != 2]['btts_x']) # 对btts_y列做同样检查 frame['split_len_y'] = frame['btts_y'].apply(lambda x: len(x.split('\n'))) print(frame[frame['split_len_y'] != 2]['btts_y'])
通过这段代码能直接定位到格式异常的单元格。
2. 修复异常数据
根据定位结果选择处理方式:
- 过滤无效行:如果这些异常行是无效数据,直接删除:
frame = frame[frame['btts_x'].apply(lambda x: len(x.split('\n')) == 2)] frame = frame[frame['btts_y'].apply(lambda x: len(x.split('\n')) == 2)]
- 补全异常值:需要保留行的话,拆分后不足2个元素的补空值,多余的只取前2个:
def safe_split(x): parts = x.split('\n') # 截取前2个元素,不足的补None return parts[:2] + [None]*(2 - len(parts[:2])) frame[['btts_x_1', 'btts_x_2']] = frame['btts_x'].apply(safe_split).apply(pd.Series).astype(float) frame[['btts_y_1', 'btts_y_2']] = frame['btts_y'].apply(safe_split).apply(pd.Series).astype(float)
3. 优化代码写法(更简洁高效)
用Pandas原生的str.split方法,指定expand=True直接生成多列,n=1确保只拆分成2部分,自动处理拆分后列数不足的情况:
frame[['btts_x_1', 'btts_x_2']] = frame['btts_x'].str.split('\n', expand=True, n=1).astype(float) frame[['btts_y_1', 'btts_y_2']] = frame['btts_y'].str.split('\n', expand=True, n=1).astype(float)
内容的提问来源于stack exchange,提问作者Aidan
相关产品推荐
相关产品推荐

