从字典创建DataFrame,字典的值是numpy数组

时间:2019-04-28 13:30:51

标签: python dictionary

我想从字典创建一个数据框,其中的值是2D numpy数组。

my_Dict={'a': array([[1, 2, 3],[4, 5, 6]]), 'b': array([[7,8,9],[10,11,12]]),'c': array([[13,14,15],[16,17,18]])}

我希望结果是一个具有2行(numpy数组中的行数)和3列的数据框,如下所示:

       a         b          c

0  [1, 2, 3]   [7,8,9]    [13,14,15]

1  [4, 5, 6]  [10,11,12] [16,17,18]

我尝试将值更改为list,并且可以正常工作。但我想将值保留为np数组,以将numby函数应用于这些值。

2 个答案:

答案 0 :(得分:1)

也许,要弄清楚为什么要这样做,我建议创建一个多级数据框。

给出:

import numpy as np
myDict = {'a': np.array([[1, 2, 3],[4, 5, 6]]),
          'b': np.array([[7,8,9],[10,11,12]]),
          'c': np.array([[13,14,15],[16,17,18]])}

将每个数组变成一个单独的数据帧,并进行合并以获得2级df。

df = pd.concat([pd.DataFrame(v) for k, v in myDict.items()], axis = 1, keys = list(myDict.keys()))

print(df)
   a         b           c        
   0  1  2   0   1   2   0   1   2
0  1  2  3   7   8   9  13  14  15
1  4  5  6  10  11  12  16  17  18

这允许数据帧的内部结构为numpy数组,而不是处理对象。 (这有助于提高某些操作的速度,而不是在对具有对象数据类型的列进行操作时始终求助于迭代。)

您仍然可以正常索引:

print(df['a'])
   0  1  2
0  1  2  3
1  4  5  6

还可以直接或使用.values

对基础numpy数组进行操作
df['a'] = df['a'].values * 10

print(df)
    a           b           c        
    0   1   2   0   1   2   0   1   2
0  10  20  30   7   8   9  13  14  15
1  40  50  60  10  11  12  16  17  18

答案 1 :(得分:0)

>>> list(np.array([[1, 2, 3],[4, 5, 6]]))
[array([1, 2, 3]), array([4, 5, 6])]
>>>

将每列的2维数组转换为两个1维数组的列表

d = {'a': np.array([[1, 2, 3],[4, 5, 6]]),
      'b': np.array([[7,8,9],[10,11,12]]),
      'c': np.array([[13,14,15],[16,17,18]])}

df = pd.DataFrame({k:list(v) for k,v in d.items()})

>>> df
           a             b             c
0  [1, 2, 3]     [7, 8, 9]  [13, 14, 15]
1  [4, 5, 6]  [10, 11, 12]  [16, 17, 18]
>>> 

>>> df.loc[0,'a']
array([1, 2, 3])
>>> df['a'].values
array([array([1, 2, 3]), array([4, 5, 6])], dtype=object)
>>> df.values
array([[array([1, 2, 3]), array([7, 8, 9]), array([13, 14, 15])],
       [array([4, 5, 6]), array([10, 11, 12]), array([16, 17, 18])]],
      dtype=object)
>>>