调用Explode()函数时触发cannot handle a non-unique multi-index!错误
问题描述
现有如下包含字符串形式列表列的DataFrame:
import pandas as pd df = pd.DataFrame({'var1': ['[2.0, 2.0, 2.0, 2.0]', '[1.0, 5.0]', '[2.0, 2.0, 2.0, 2.0]', '[6.0]', '[2.0, 5.0]', '[2.0, 2.0, 2.0, 2.0]', '[3.0]', '[1.0, 5.0]'], 'var2': ['[A4003250601, A4003250601, A4003250601, A4003250601]','[A4002000401, A9262000201]', '[A4003250601, A4003250601, A4003250601, A4003250601]', '[A4001800801]', '[A4002000401, A9262000201]', '[A4003250601, A4003250601, A4003250601, A4003250601]', '[A4001800801]', '[A4002000401, A9262000201]'], 'var3': ['[335.764, 335.764, 335.764, 335.764]', '[191.0, 310.0]', '[335.764, 335.764, 335.764, 335.764]', '[240.0]', '[191.0, 310.0]', '[335.764, 335.764, 335.764, 335.764]', '[240.0]', '[191.0, 310.0]'], 'var4':['[15659839, 15659839, 15659839, 15659839]', '[15659891, 15659891]', '[15659839, 15659839, 15659839, 15659839]', '[15659891]', '[15659891, 15659891]', '[15659839, 15659839, 15659839, 15659839]', '[15659891]', '[15659891, 15659891]'], 'var5':['[PMAC, PMAC, PMAC, PMAC]', '[SUNDARAM FASTENERS LTD (GUMMIDIPOONDI), AUTOLEC DIVISION , SUNDARAM FASTENERS LTD (GUMMIDIPOONDI), AUTOLEC DIVISION ]', '[PMAC, PMAC, PMAC, PMAC]', '[SUNDARAM FASTENERS LTD (GUMMIDIPOONDI), AUTOLEC DIVISION ]', '[SUNDARAM FASTENERS LTD (GUMMIDIPOONDI), AUTOLEC DIVISION , SUNDARAM FASTENERS LTD (GUMMIDIPOONDI), AUTOLEC DIVISION ]', '[PMAC, PMAC, PMAC, PMAC]', '[SUNDARAM FASTENERS LTD (GUMMIDIPOONDI), AUTOLEC DIVISION ]', '[SUNDARAM FASTENERS LTD (GUMMIDIPOONDI), AUTOLEC DIVISION , SUNDARAM FASTENERS LTD (GUMMIDIPOONDI), AUTOLEC DIVISION ]'], 'var6': [20221031,20221031,20221101, 20221101, 20221101, 20221102,20221102,20221102], 'var7':[0.8544,0.42, 0.8544, 0.729,0.42, 0.8544, 0.729, 0.42], 'var8':[1200,1000,1200,900,1000,1200,900,1000]})
尝试用以下代码将列表元素拆分到单独行时,触发错误:ValueError: cannot handle a non-unique multi-index!
(df.set_index(['var6', 'var7', 'var8']) .apply(lambda col: col.astype(str).str.split(',') .explode()) .reset_index() .reindex(df.columns, axis=1))
注:调用explode()前代码运行正常,调用后立即报错。
错误原因
- 非唯一多索引冲突:
set_index(['var6','var7','var8'])生成的多索引并非唯一(例如(20221031, 0.8544, 1200)在原DataFrame中重复出现),当对每个列执行explode后,同一索引会对应多行数据,apply尝试合并这些列时,非唯一索引无法正确对齐,触发报错。 - 字符串处理不彻底:原代码中
astype(str)属于冗余操作(目标列已是字符串类型),且未清理列表字符串首尾的[]和元素前后的空格,拆分后会得到带多余符号的脏数据(例如'[2.0'、' 2.0')。
解决方案
方案一:先将字符串列转为真实列表,再批量Explode
先定义清理函数,把字符串形式的列表转为Python列表,再用pandas.DataFrame.explode批量处理目标列:
def str_to_list(s): # 去除首尾[],按逗号拆分,清理元素的空格和引号 return [x.strip().strip("'").strip('"') for x in s.strip('[]').split(',') if x.strip()] # 对需要拆分的列应用转换函数 cols_to_explode = ['var1', 'var2', 'var3', 'var4', 'var5'] df[cols_to_explode] = df[cols_to_explode].applymap(str_to_list) # 批量拆分列表到单独行 result = df.explode(cols_to_explode).reset_index(drop=True)
方案二:直接处理字符串拆分,避免索引问题
无需提前设置多索引,直接对每个目标列做字符串清理、拆分、Explode,再与非列表列合并:
# 复制非列表列作为基础结果 non_list_cols = ['var6', 'var7', 'var8'] result = df[non_list_cols].copy() # 逐个处理需要拆分的列 for col in ['var1', 'var2', 'var3', 'var4', 'var5']: # 去除首尾[] → 按逗号拆分 → 拆分到多行 → 清理元素空格 result[col] = df[col].str.strip('[]').str.split(',').explode().str.strip() # 重置索引 result = result.reset_index(drop=True)
两种方案均可得到干净的拆分结果,且不会触发多索引相关错误。
内容的提问来源于stack exchange,提问作者Deb
相关产品推荐
相关产品推荐

