Pandas用str.split生成DataFrame时列数不匹配报错如何解决?
错误原因
- 你的
Splitter_Name列中新增了不包含SPL子串的脏数据:str.split('SPL',1)遇到无匹配子串的值时,只会返回长度为1的列表,不会拆分为两个元素。此前所有数据都包含SPL所以能正常运行,当出现不匹配的行后,最终生成的列表集合里同时存在长度为1和长度为2的元素,你指定了2个列名但部分行只有1个值,就触发了该断言错误。 - 补充说明:如果该列存在空值(NaN),也会导致拆分后返回长度为1的列表,触发同样的报错。
解决方法
方案1:使用split自带的expand参数直接生成DataFrame
str.split的expand参数会直接返回对齐后的DataFrame,拆分失败的位置自动填充为NaN,无需手动转列表再构造,是最高效的解决方式:
# 拆分后直接指定列名 fe_split = fe.Splitter_Name.str.split('SPL', 1, expand=True) fe_split.columns = ['splitter', 'number']
如果不需要保留拆分失败的行,直接过滤空值即可:
fe_split = fe_split.dropna(subset=['number'])
方案2:提前过滤不符合格式的行
如果要保证拆分结果100%符合预期,先筛选出包含SPL的行再执行拆分,同时可以单独捞取异常数据排查:
# 筛选符合格式的行,na=False表示空值也判定为不符合规则 fe_valid = fe[fe.Splitter_Name.str.contains('SPL', na=False)] # 执行拆分 fe_split = pd.DataFrame(fe_valid.Splitter_Name.str.split('SPL', 1).tolist(), columns=['splitter', 'number']) # 可选:导出脏数据排查原因 bad_data = fe[~fe.Splitter_Name.str.contains('SPL', na=False)]
内容的提问来源于stack exchange,提问作者Marie Payne
相关产品推荐
相关产品推荐

