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
相关产品推荐
相关产品推荐

