从numpy数组列表构建pandas数据框

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?

Cle*_*leb 8

我会用.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

  • 不错,替代方案可以是`pd.DataFrame(dict(zip(names,data)),columns = names)` (3认同)