Pandas多列explode报columns must have matching element counts错
Pandas多列explode触发ValueError: columns must have matching element counts解决
报错场景
对DataFrame中存储列表的字段做空值转换后,调用多列explode方法时触发如下报错:
ValueError: columns must have matching element counts
问题复现
测试样例数据
product title variation_list Chauvet DJ GigBar Move Effect Light System ['Black', 'White'] Pioneer DJ DJM-S11 Professional DJ Mixer [] DJM-S11 Professional DJ [] Pioneer DJ ['black'] dj ['white','blue','red']
触发报错的原代码
df[['short_des_list']] = df[['short_des_list']].applymap(lambda x: None if any(eval(x)) == False else eval(x)) df[['variation_list']] = df[['variation_list']].applymap(lambda x: None if any(eval(x)) == False else eval(x)) df[['price_list']] = df[['price_list']].applymap(lambda x: None if any(eval(x)) == False else eval(x)) df = df.explode(['short_des_list','variation_list','price_list'])
报错根因
- 多列同时调用
explode时,Pandas要求同一行内所有待拆分列的可迭代对象长度完全相等,原代码将空列表转为None,且不同列的非空列表长度不固定,直接触发长度校验报错 - 原代码使用
eval解析字符串格式的列表存在代码注入风险,且空值转换逻辑不符合「空列表行保留不拆分」的预期
修复方案
- 用
ast.literal_eval替代eval做安全的列表解析,避免安全风险 - 空列表不转
None,而是包装为单元素列表[[]],保证explode后空列表保留、且不会被拆分为多行 - 逐列调用explode,兼容不同列列表长度不一致的场景,避免多列同时explode的长度校验问题
修复后代码
import ast import pandas as pd def parse_list_field(cell_val): # 处理空值 if pd.isnull(cell_val): return [[]] # 安全解析字符串格式列表 parsed_val = ast.literal_eval(cell_val) # 非列表/空列表统一包装为单元素空列表,保证explode后保留空列表、不拆行 if not isinstance(parsed_val, list) or len(parsed_val) == 0: return [[]] return parsed_val # 指定所有需要拆分的列表字段 list_columns = ['short_des_list', 'variation_list', 'price_list'] for col in list_columns: df[col] = df[col].apply(parse_list_field) # 逐列explode for col in list_columns: df = df.explode(col)
预期输出结果
product title variation_list Chauvet DJ GigBar Move Effect Light System Black Chauvet DJ GigBar Move Effect Light System White Pioneer DJ DJM-S11 Professional DJ Mixer [] DJM-S11 Professional DJ [] Pioneer DJ black dj white dj blue dj red
内容的提问来源于stack exchange,提问作者hawaj
相关产品推荐
相关产品推荐

