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

pd.explode因多列列表长度不一致报错,如何将列表元素拆分为单独行?

多列列表长度不一致时的DataFrame展开解决方案

问题根因

pandas原生pd.DataFrame.explode()要求同一行内所有待拆分类列表列的长度完全一致,当出现逐行元素数量不匹配时就会抛出ValueError: cannot reindex from a duplicate axis错误,你的场景中第4行TGR1列列表长度为10,其余两列为11,不符合原生explode的要求。

可行解决方法

方法1:逐行对齐列表长度后统一展开(推荐,保留原行关联逻辑)

先对每行所有待拆分列表补全/截断到该行的最大/最小长度,再调用原生explode即可,适合需要保持同一原行内元素对应关系的场景。
示例代码:

import pandas as pd
import numpy as np

# 定义列表补齐函数,短列表末尾补NaN到目标长度
def pad_list(lst: list, target_len: int) -> list:
    return lst + [np.nan] * (target_len - len(lst))

# 逐行处理,将每行3个列表统一补齐到该行的最大长度
df[["TGR1", "TGR2", "TGR3"]] = df.apply(
    lambda row: [
        pad_list(row[col], max(map(len, row[["TGR1", "TGR2", "TGR3"]])))
        for col in ["TGR1", "TGR2", "TGR3"]
    ],
    axis=1,
    result_type="expand"
)

# 直接调用多列explode即可
res = df.explode(["TGR1", "TGR2", "TGR3"], ignore_index=True)

如果业务上允许截断长列表,把补齐逻辑换成截断到该行最小长度即可。

方法2:单列单独展开后拼接

如果不需要保留原行的元素对应关系,只是要把所有列的所有元素按顺序展开为行,可以单独拆分每一列后再横向拼接:
示例代码:

# 单独拆分每一列
s1 = df["TGR1"].explode().reset_index(drop=True)
s2 = df["TGR2"].explode().reset_index(drop=True)
s3 = df["TGR3"].explode().reset_index(drop=True)

# 横向拼接,短列自动补NaN
res = pd.concat([s1, s2, s3], axis=1)

内容的提问来源于stack exchange,提问作者chuky pedro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:27:02