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

如何将嵌套列表转换为带集合标识的Pandas DataFrame?

将嵌套列表转换为带分组标记的Pandas DataFrame

我构造了如下嵌套列表:

list_1 = [123, 1344, 678, 1455, 900, 1899, 567]
list_2 = [1677, 2334]
list_3 = [2010, 1234]
lst = []
lst.append(list_1)
lst.append(list_2)
lst.append(list_3)
print(lst)

输出结果:

[[123, 1344, 678, 1455, 900, 1899, 567], [1677, 2334], [2010, 1234]]

我需要把它转换成包含「Number」和「Set」列的Pandas DataFrame,其中Set列标记元素所属的集合序号(第一个子列表对应Set 1,以此类推),期望的DataFrame样式如下:

NumberSet
1231
13441
6781
14551
9001
18991
5671
16772
23342
20103
12343

我尝试了以下代码但未得到预期结果,请求帮助:

a = len(lst)     
df3 = pd.DataFrame(columns=['Number','Set'])
for i in lst:
    for j in range(a):
        df2= pd.DataFrame({'Number':i})
        df2['Set']=j+1
        pd.concat([df2,df3],ignore_index = True)
        print(df2)
        break

问题分析

你的代码存在几个关键问题:

  • 内层循环多余且逻辑错误:内层for j in range(a)完全没必要,break语句导致只执行一次循环,Set值被固定为1,无法对应正确的子列表序号
  • concat结果未保存:pd.concat([df2,df3],ignore_index = True)执行后没有赋值给df3,每次合并的结果都丢失,最终df3还是初始的空DataFrame
  • Set值赋值错误:应该根据子列表在lst中的位置(索引+1)设置Set值,而非循环变量j

正确解法

方法1:修正循环逻辑

import pandas as pd

list_1 = [123, 1344, 678, 1455, 900, 1899, 567]
list_2 = [1677, 2334]
list_3 = [2010, 1234]
lst = [list_1, list_2, list_3]

df3 = pd.DataFrame(columns=['Number','Set'])
for idx, sub_list in enumerate(lst, start=1):
    # 为当前子列表创建临时DataFrame,Set值为当前索引
    temp_df = pd.DataFrame({'Number': sub_list, 'Set': idx})
    # 合并到df3并重新赋值
    df3 = pd.concat([df3, temp_df], ignore_index=True)

print(df3)

方法2:列表推导式(推荐)

先构造所有(Number, Set)数据对,再直接转DataFrame,效率更高:

import pandas as pd

list_1 = [123, 1344, 678, 1455, 900, 1899, 567]
list_2 = [1677, 2334]
list_3 = [2010, 1234]
lst = [list_1, list_2, list_3]

# 生成所有数据对
data = [(num, set_num) for set_num, sub_list in enumerate(lst, start=1) for num in sub_list]
df = pd.DataFrame(data, columns=['Number', 'Set'])

print(df)

方法3:Pandas explode方法

先构造包含Set和子列表的DataFrame,再展开子列表:

import pandas as pd

list_1 = [123, 1344, 678, 1455, 900, 1899, 567]
list_2 = [1677, 2334]
list_3 = [2010, 1234]
lst = [list_1, list_2, list_3]

# 先创建包含Set和子列表的DataFrame
df = pd.DataFrame({'Set': range(1, len(lst)+1), 'Number': lst})
# 展开子列表
df = df.explode('Number', ignore_index=True)
# 调整列顺序(可选)
df = df[['Number', 'Set']]

print(df)

以上三种方法都能得到期望的DataFrame结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 15:02:06