You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:54:22