我想知道是否有一种简单的方法可以完成从 numpy 数组列表生成 pandas DataFrame 的明显任务,其中列是数组。默认行为似乎让数组成为行,我完全不明白为什么。这是一个简单的例子:
names = ['data1', 'data2', 'data3']
data = [np.arange(10) for _ in names]
df = pd.DataFrame(data=data, columns=names)
这会出错,表明 pandas 需要 10 列。
如果我这样做
df = pd.DataFrame(data=data)
我得到一个包含 10 列和 3 行的 DataFrame。
鉴于将行追加到 DataFrame 中通常比将列追加困难得多,我想知道这种行为,例如假设我很快想将第 4 个数据数组放入 DataFrame 我希望数据按列组织
df['data4'] = new_array
如何快速构建我想要的 DataFrame?
最佳答案
正如@MaxGhenis 在评论中指出的那样,from_items
是 deprecated as of version 0.23 .该链接建议改用 from_dict
,因此可以将旧答案修改为:
pd.DataFrame.from_dict(dict(zip(names, data)))
-------------------------------------------- ---老答案-------------------------------------------- ------------------
我会使用 .from_items
:
pd.DataFrame.from_items(zip(names, data))
给出
data1 data2 data3
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5
6 6 6 6
7 7 7 7
8 8 8 8
9 9 9 9
这也应该比转置更快:
%timeit pd.DataFrame.from_items(zip(names, data))
1000 loops, best of 3: 281 µs per loop
%timeit pd.DataFrame(data, index=names).T
1000 loops, best of 3: 730 µs per loop
然后添加第四列也相当简单:
df['data4'] = range(1, 11)
给出
data1 data2 data3 data4
0 0 0 0 1
1 1 1 1 2
2 2 2 2 3
3 3 3 3 4
4 4 4 4 5
5 5 5 5 6
6 6 6 6 7
7 7 7 7 8
8 8 8 8 9
9 9 9 9 10
正如@jezrael 在评论中提到的,第三种选择是(注意:不保证订单)
pd.DataFrame(dict(zip(names, data)), columns=names)
时间:
%timeit pd.DataFrame(dict(zip(names, data)))
1000 loops, best of 3: 281 µs per loop
关于python - 从 numpy 数组列表构建 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42952672/