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

时间:2017-03-22 13:12:16

标签: python pandas dataframe

我想知道明显的任务是否有一种简单的方法可以从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?

3 个答案:

答案 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.TTpandas.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