Pandas如何将列表列按相邻元素拆分为两列并展开多行
实现方法
你可以通过「相邻元素配对+行展开+列拆分」的逻辑快速完成转换,以下是两种可直接运行的实现方案:
方案1:通用兼容写法(适配所有pandas版本)
核心逻辑是先对每个列表生成相邻元素配对,再展开行拆分列:
import pandas as pd # 原始数据构造(替换成你自己的DataFrame即可) df = pd.DataFrame({ 'Name': ['Foo', 'Bar', 'Baz'], 'Col1': [['A', 'C', 'B', 'D', 'E'], ['G', 'M', 'O'], ['E', 'B']] }) # 转换逻辑 result = ( df # 为每个列表生成相邻两两配对的元组列表 .assign(pair = lambda d: d['Col1'].apply(lambda x: list(zip(x[:-1], x[1:])))) # 按配对数展开为多行 .explode('pair') # 拆分配对元组为两个新列 .assign( New_Col1 = lambda d: d['pair'].str[0], New_Col2 = lambda d: d['pair'].str[1] ) # 清理冗余列、重置索引 .drop(columns=['Col1', 'pair']) .reset_index(drop=True) )
运行后输出的result和目标结构完全一致:
Name New_Col1 New_Col2 0 Foo A C 1 Foo C B 2 Foo B D 3 Foo D E 4 Bar G M 5 Bar M O 6 Baz E B
方案2:高版本简洁写法(pandas 1.0+ 支持,性能更好)
不需要生成中间配对列,直接通过索引切片+重复行的方式实现:
result = pd.DataFrame({ # Name列按配对数(列表长度-1)重复对应次数 'Name': df['Name'].repeat(df['Col1'].str.len() - 1), # 取每个列表除最后一个元素外的所有值,展开作为第一列 'New_Col1': df['Col1'].str[:-1].explode(), # 取每个列表除第一个元素外的所有值,展开作为第二列 'New_Col2': df['Col1'].str[1:].explode() }).reset_index(drop=True)
逻辑说明
- 长度为n的列表相邻两两配对共生成
n-1组,刚好和x[:-1](前n-1个元素)、x[1:](后n-1个元素)的长度匹配,按位置拼接后不会出现错配、漏配。 explode方法会自动把列表/序列中的嵌套元素拆分为单独行,同时保留原行其他列的取值,不需要手动写循环遍历。
内容的提问来源于stack exchange,提问作者tinok
相关产品推荐
相关产品推荐

