如何将嵌套列表转换为带集合标识的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样式如下:
| Number | Set |
|---|---|
| 123 | 1 |
| 1344 | 1 |
| 678 | 1 |
| 1455 | 1 |
| 900 | 1 |
| 1899 | 1 |
| 567 | 1 |
| 1677 | 2 |
| 2334 | 2 |
| 2010 | 3 |
| 1234 | 3 |
我尝试了以下代码但未得到预期结果,请求帮助:
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
相关产品推荐
相关产品推荐

