Whi*_*hir 9 python dataframe pandas
我想知道是否有一个简单的方法可以从一个numpy数组列表中生成一个pandas DataFrame,其中列是数组.默认行为似乎让数组成为行,我完全不明白为什么.这是一个简单的例子:
names = ['data1', 'data2', 'data3']
data = [np.arange(10) for _ in names]
df = pd.DataFrame(data=data, columns=names)
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误,表明pandas需要10列.
如果我做
df = pd.DataFrame(data=data)
Run Code Online (Sandbox Code Playgroud)
我得到一个包含10列和3行的DataFrame.
鉴于将行附加到DataFrame的行通常要困难得多,我想知道这种行为,例如,假设我很快就想将第4个数据数组放入DataFrame中我希望将数据组织成列来做
df['data4'] = new_array
Run Code Online (Sandbox Code Playgroud)
如何快速构建我想要的DataFrame?
我会用.from_items:
pd.DataFrame.from_items(zip(names, data))
Run Code Online (Sandbox Code Playgroud)
这使
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
Run Code Online (Sandbox Code Playgroud)
这也应该比转置更快:
%timeit pd.DataFrame.from_items(zip(names, data))
Run Code Online (Sandbox Code Playgroud)
1000循环,最佳3:每循环281μs
%timeit pd.DataFrame(data, index=names).T
Run Code Online (Sandbox Code Playgroud)
1000个循环,最佳3:730μs/循环
添加第四列也很简单:
df['data4'] = range(1, 11)
Run Code Online (Sandbox Code Playgroud)
这使
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
Run Code Online (Sandbox Code Playgroud)
编辑:
正如@jezrael所提到的,第三种选择是
pd.DataFrame(dict(zip(names, data)), columns=names)
Run Code Online (Sandbox Code Playgroud)
定时:
%timeit pd.DataFrame(dict(zip(names, data)))
Run Code Online (Sandbox Code Playgroud)
1000循环,最佳3:每循环281μs