pandas - 为列表列表中的每个列表创建一个 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]
解决方案
一种方法
numpy.concatenate
和numpy.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)
推荐阅读
- c++ - 从 docker image build 中省略设置文件
- json - 从端点返回数据时的最佳实践?
- github - 如何构建 devops 脚本以使用 gulp 构建和部署 github 页面?
- ionic-framework - Ionic 4 + WhatsApp 分享 - 在我分享我的信息后获取接收者/联系方式
- c - 为什么不能在数组中分配多个字符?
- vba - 如何跳过一个循环的 FOR 循环
- html - Bootstrap 4表单不发送选择框的内容
- python - 升级到 Python 3.7 后使用“python\python36”的 Pipenv 致命错误
- react-native - 如何使用本机反应将图像上传到firebase
- sql-server - 网络共享上带有 tnsnames.ora 的 SQL Server 链接服务器 - ORA:12154