我想知道明显的任务是否有一种简单的方法可以从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的行通常要困难得多,我想知道这种行为,例如:让我们说我很快想把第四个数据阵列放到DataFrame中我希望将数据组织成列来做
df['data4'] = new_array
如何快速构建我想要的DataFrame?
答案 0 :(得分:6)
我会使用.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次循环,最佳3次:每次循环281μs
%timeit pd.DataFrame(data, index=names).T
1000个循环,最佳3:730μs/循环
添加第四列也很简单:
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次循环,最佳3次:每次循环281μs
答案 1 :(得分:2)
有很多方法可以解决您的问题,但最简单的方法似乎是df.T
(T
是pandas.DataFrame.transpose
的简写):
>>> df = pd.DataFrame(data=data, index=names)
>>> df
0 1 2 3 4 5 6 7 8 9
data1 0 1 2 3 4 5 6 7 8 9
data2 0 1 2 3 4 5 6 7 8 9
data3 0 1 2 3 4 5 6 7 8 9
>>> df.T
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
答案 2 :(得分:1)
from_items
现在已弃用。请改用from_dict
:
df = pd.DataFrame.from_dict({
'data1': np.arange(10),
'data2': np.arange(10),
'data3': np.arange(10)
})
这将返回:
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