如何展开Pandas DataFrame中长度不一致的多列表列?
解决多列列表长度不一致时的DataFrame展开问题
当尝试同时展开包含长度不一致列表的多列时,explode会因元素数量不匹配报错。解决思路是先将每行的所有列表补全到该行的最大长度,用NaN填充缺失值,再执行explode操作。
步骤1:定义补全列表的函数
import pandas as pd import numpy as np def pad_list(lst, target_length): # 将列表补全到目标长度,不足部分用NaN填充 return lst + [np.nan] * (target_length - len(lst))
步骤2:处理原始DataFrame
# 原始数据 df = pd.DataFrame({'Name': ['Name1','Name2'], 'Time': [[0.0, 5.0, 10.0, 15.0],[0.0, 4.0, 28.0, 48.0]], 'Values': [[0.0, 5.0, 10.0],[0.0, 4.0, 48.0]]}) # 计算每行中列表的最大长度 df['max_length'] = df.apply(lambda row: max(len(row['Time']), len(row['Values'])), axis=1) # 补全Time和Values列的列表到最大长度 df['Time'] = df.apply(lambda row: pad_list(row['Time'], row['max_length']), axis=1) df['Values'] = df.apply(lambda row: pad_list(row['Values'], row['max_length']), axis=1)
步骤3:执行展开操作
# 展开并删除辅助列 df2 = df.explode(['Time', 'Values']).drop('max_length', axis=1) # 重置索引(可选,让索引连续) df2 = df2.reset_index(drop=True)
最终输出
Name Time Values 0 Name1 0.0 0.0 1 Name1 5.0 5.0 2 Name1 10.0 10.0 3 Name1 15.0 NaN 4 Name2 0.0 0.0 5 Name2 4.0 4.0 6 Name2 28.0 48.0 7 Name2 48.0 NaN
注:你提供的期望输出中部分数值与原始数据不符(比如Name1的Values出现了Name2的Time值),上述结果是基于原始数据的正确展开结果。
内容的提问来源于stack exchange,提问作者hoa tran
相关产品推荐
相关产品推荐

