pandas explode处理含空列表行时抛ValueError的解决方法
问题场景
DataFrame待explode列存在空列表时,执行explode操作会抛出如下错误:
ValueError: columns must have matching element counts
示例DataFrame数据:
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']
现有实现代码:
import numpy as np df[['variation_list']] = df[['variation_list']].applymap(lambda x: eval(x, {'nan': np.nan})) df = df.explode(['variation_list'])
删除空列表行后报错消失,需要在保留空列表对应行的前提下解决报错,正常完成explode操作。
报错原因
explode方法要求同一行中所有待爆炸列的可迭代对象长度匹配,空列表长度为0,和其他行非空列表的长度不一致,因此触发报错。
解决方法
在执行explode前,将待爆炸列中的空列表替换为仅包含一个np.nan的列表,保证每行对应列表长度至少为1,即可兼容explode逻辑,同时保留空列表对应的行。
修改后可运行代码:
import numpy as np # 原有字符串转列表逻辑 df[['variation_list']] = df[['variation_list']].applymap(lambda x: eval(x, {'nan': np.nan})) # 替换空列表为[np.nan],规避长度不匹配问题 df['variation_list'] = df['variation_list'].apply(lambda x: x if len(x) > 0 else [np.nan]) # 正常执行explode df = df.explode(['variation_list'])
处理后效果:
- 非空列表的行正常按元素拆分为多行,和原生explode逻辑一致
- 原空列表对应的行完整保留,
variation_list字段值为NaN - 全pandas版本通用,无版本兼容问题
注:pandas 1.4.0及以上版本已修复单列explode时空列表触发的长度报错问题,空列表会直接被处理为NaN值保留行,上述替换方法对所有版本均兼容。
内容的提问来源于stack exchange,提问作者boyenec
相关产品推荐
相关产品推荐

