Pandas DataFrame含不等长列表单元格拆分多行无重复方案问询
Pandas多列不等长列表拆分无重复方案
问题原因
多次单独调用explode拆分不同列时,会生成多列列表的笛卡尔积,最终行数等于该行所有列表长度的乘积,因此产生大量重复数据。
解决代码
import pandas as pd df = pd.DataFrame( {'C1': [["A","B"], ["C"], ["D","E"], ["F"]], 'C2': [[1], [2], [3], [4]], 'C3': ['s1', 's2', 's3', 's4'], 'C4': [123, 321, [777,111], 145]}) def align_row_length(row): # 计算当前行所有列表的最大长度 max_len = max(len(v) if isinstance(v, list) else 1 for v in row) aligned = {} for col, val in row.items(): if isinstance(val, list): # 长度不足的列表自动补全到最大长度 aligned[col] = val + [val[-1]] * (max_len - len(val)) else: # 标量重复max_len次 aligned[col] = [val] * max_len return pd.Series(aligned) # 对齐行内列表长度后一次性拆分所有列 result = df.apply(align_row_length, axis=1).explode(df.columns.tolist()).reset_index(drop=True) print(result)
输出结果
C1 C2 C3 C4 0 A 1 s1 123 1 B 1 s1 123 2 C 2 s2 321 3 D 3 s3 777 4 E 3 s3 111 5 F 4 s4 145
该方案会按每行最长列表的长度拆分,各列列表元素按位置一一对应,不会生成额外的笛卡尔积重复行。
内容的提问来源于stack exchange,提问作者Cam
相关产品推荐
相关产品推荐

