首页 > 解决方案 > 为列表列表中的每个列表创建一个 df

问题描述

我有一个列表列表和另一个列表

lslsls = [[[1,2,3],[11,12,13],[21,22,23],[1,2,3],[11,12,13],[21,22,23]],[[1,2,3],[11,12,13],[21,22,23],[1,2,3],[11,12,13],[21,22,23]],[[1,2,3],[11,12,13],[21,22,23],[1,2,3],[11,12,13],[21,22,23]]]

ls = ["a", "b", "c"]

我希望为“lslsls”中的每个列表列表创建一个熊猫数据框,当我这样做时,将“ls”的每个元素添加到数据框的每一行。我可以单独做到这一点,即

import pandas as pd    
df = pd.DataFrame(lslsls[0])
df["name"] = ls[0]

但是,我需要遍历“lslsls”中的所有列表列表,并在浏览时将 ls 中的元素添加为一列。这将创建 3 个单独的 df,理想情况下我可以将它们命名为“ls”中的每个元素

所以最终得到:

import pandas as pd    
a = pd.DataFrame(lslsls[0])
a["name"] = ls[0]
b = pd.DataFrame(lslsls[1])
b["name"] = ls[1]
c = pd.DataFrame(lslsls[2])
c["name"] = ls[2]

这是我的尝试:

for i in ls:
    for p in lslsls:
        i = pd.DataFrame(lslsls[p])
        i["name"] = ls[i]
        

标签: pandaslistdataframefor-loop

解决方案


一种方法

numpy.concatenatenumpy.repeat

#import numpy as np
(pd.DataFrame(np.concatenate(lslsls),
              index=np.repeat(ls, tuple(map(len, lslsls))))
   .rename_axis('Name').reset_index())


   Name   0   1   2
0     a   1   2   3
1     a  11  12  13
2     a  21  22  23
3     a   1   2   3
4     a  11  12  13
5     a  21  22  23
6     b   1   2   3
7     b  11  12  13
8     b  21  22  23
9     b   1   2   3
10    b  11  12  13
11    b  21  22  23
12    c   1   2   3
13    c  11  12  13
14    c  21  22  23
15    c   1   2   3
16    c  11  12  13
17    c  21  22  23

或者

(pd.DataFrame(np.concatenate(lslsls))
   .assign(Name=np.repeat(ls, tuple(map(len, lslsls)))))


     0   1   2 Name
0    1   2   3    a
1   11  12  13    a
2   21  22  23    a
3    1   2   3    a
4   11  12  13    a
5   21  22  23    a
6    1   2   3    b
7   11  12  13    b
8   21  22  23    b
9    1   2   3    b
10  11  12  13    b
11  21  22  23    b
12   1   2   3    c
13  11  12  13    c
14  21  22  23    c
15   1   2   3    c
16  11  12  13    c
17  21  22  23    c

%%timeit
pd.DataFrame(np.concatenate(lslsls)).assign(Name=np.repeat(ls, tuple(map(len, lslsls))))
914 µs ± 84.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
(pd.DataFrame(np.concatenate(lslsls),
              index=np.repeat(ls, tuple(map(len, lslsls))))
   .rename_axis('Name').reset_index())
1.23 ms ± 12 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)


%%timeit
df = pd.concat([pd.DataFrame(each_list).assign(name=Name) 
                for Name,each_list in zip(ls,lslsls)])
4.49 ms ± 105 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

推荐阅读