Pandas拆分单列数据为多列时触发ValueError长度不匹配报错求助
问题背景
- 存在仅包含单列
Questionsbysortorder的Pandas DataFrame,每行存储逗号分隔的Q编号-取值格式键值对,原始数据样例如下:
Questionsbysortorder Q1-4,Q2-3,Q3-2,Q4-3,Q5-3 Q1-1,Q2-2,Q3-1,Q4-1 Q1-5,Q2-3,Q3-3
- 需求:将每行的键值对拆分展开为独立列,对应键不存在的位置填充
NA,预期输出效果如下:
Questionsbysortorder Q1 Q2 Q3 Q4 Q5 Q1-4,Q2-3,Q3-2,Q4-3,Q5-3 4 3 2 3 3 Q1-1,Q2-2,Q3-1,Q4-1 1 2 1 1 NA Q1-5,Q2-3,Q5-3 5 3 NA NA 3
报错原因
原有代码的核心问题是两次explode操作既没有保留原始行的对应关系,也没有拆分出「问题编号」「取值」两个独立字段,导致执行set_index().unstack().reset_index()后生成的DataFrame实际包含3列,此时强行给列赋值长度为2的列名列表,就触发了长度不匹配错误:
ValueError: Length mismatch: Expected axis has 3 elements, new values have 2 elements
后续的pivot逻辑因为字段混淆也无法得到正确结果。
修复方案
不需要复杂的explode、unstack、pivot链式操作,直接逐行将字符串拆分为键值对字典,再展开为多列拼接即可,代码简洁且逻辑清晰:
import pandas as pd import numpy as np # 初始化原始数据集 df = pd.DataFrame({ 'Questionsbysortorder': [ 'Q1-4,Q2-3,Q3-2,Q4-3,Q5-3', 'Q1-1,Q2-2,Q3-1,Q4-1', 'Q1-5,Q2-3,Q5-3' ] }) # 逐行拆分字符串为键值对,再展开为独立列 split_cols = df['Questionsbysortorder'].apply( lambda row_str: { kv_pair.split('-')[0]: kv_pair.split('-')[1] for kv_pair in row_str.split(',') } ).apply(pd.Series) # 拼接原始列与拆分后的列,缺失位置填充NA final_df = pd.concat([df, split_cols], axis=1).fillna('NA') print(final_df)
运行后输出结果完全符合预期:
Questionsbysortorder Q1 Q2 Q3 Q4 Q5 0 Q1-4,Q2-3,Q3-2,Q4-3,Q5-3 4 3 2 3 3 1 Q1-1,Q2-2,Q3-1,Q4-1 1 2 1 1 NA 2 Q1-5,Q2-3,Q5-3 5 3 NA NA 3
内容的提问来源于stack exchange,提问作者Nithin Reddy
相关产品推荐
相关产品推荐

