Pandas explode报错cannot reindex from a duplicate axis解决
Pandas 同步拆分多列列表为多行解决方案
问题原因
- 执行
df.apply(pd.Series.explode)触发ValueError: cannot reindex from a duplicate axis,是因为1.3.0以下版本的pandas不支持多列explode的自动索引对齐,逐列explode后生成的重复索引在合并时会触发该报错。 - 逐列单独explode得到9行错误结果,是因为第一次拆分
Product_ID列时,No_of_items列的完整列表会被广播到每一行拆分结果上,第二次拆分No_of_items时会对每一行的列表全量拆分,最终生成两列长度的笛卡尔积,和预期的按位置配对拆分逻辑不符。
实现方法
方法1:pandas 1.3.0及以上版本(最简方案)
高版本pandas原生支持传入列名列表实现多列同步拆分,两列会按列表元素位置一一对应拆行,不会生成笛卡尔积:
# ignore_index=True可直接重置索引,不需要额外处理 result = df.explode(["Product_ID", "No_of_items"], ignore_index=True) # 可选:将No_of_items转为数值类型(拆分后默认是object类型) result["No_of_items"] = result["No_of_items"].astype(int)
方法2:兼容低版本pandas
如果使用的pandas版本低于1.3.0,可以先将两列的元素按位置配对为元组,拆分临时列后再还原为两列:
# 按行将两个列表的对应位置元素配对 df["tmp_pair"] = df.apply(lambda row: list(zip(row["Product_ID"], row["No_of_items"])), axis=1) # 仅拆分配对后的临时列 df_exploded = df.explode("tmp_pair", ignore_index=True) # 将元组拆分回两个独立列 df_exploded[["Product_ID", "No_of_items"]] = pd.DataFrame( df_exploded["tmp_pair"].tolist(), index=df_exploded.index ) # 删除临时列得到最终结果 result = df_exploded.drop(columns=["tmp_pair"])
该方法要求每行Product_ID和No_of_items的列表长度完全一致,你已确认该前提满足,不会出现元素错位问题。
内容的提问来源于stack exchange,提问作者Crystal
相关产品推荐
相关产品推荐

