Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从dict值为numpy数组的字典创建数据帧_Python_Dictionary - Fatal编程技术网

Python 从dict值为numpy数组的字典创建数据帧

Python 从dict值为numpy数组的字典创建数据帧,python,dictionary,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,

我想从一个字典中创建一个数据帧,其中的值是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函数应用于这些值

>>> list(np.array([[1, 2, 3],[4, 5, 6]]))
[array([1, 2, 3]), array([4, 5, 6])]
>>>
将每列的二维数组转换为两个一维数组的列表

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)
>>>

也许,为了解决为什么要这样做,我会建议创建一个多级数据帧

鉴于:

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]])}
将每个阵列转换为一个单独的数据帧,并通过concat获得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数组,而不是处理对象。(这有助于提高某些操作的速度,而不是在对数据类型为object的列进行操作时总是求助于迭代。)

您仍然可以索引:

print(df['a'])
   0  1  2
0  1  2  3
1  4  5  6
还可以直接或使用
.values

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

只是想知道,一列中的所有值是否都具有相同的长度?(因为如果是,您最好将它们保存为3列而不是1列,并且仍然能够在基础数组上使用所有numpy操作)谢谢您的评论。稍后我想将这个数据框与另一个数据框合并,这些列表示某些结果的不同属性的值。这就是为什么每列引用一个属性对我来说很重要的原因。在这种情况下,让我写一个建议供您在这里使用。
…数据帧的内部结构是numpy数组,而不是处理对象。
-为什么这样做有利?我说错了吗???我在问-我不使用多索引/继承人数据帧/系列,也没有很好的理解。直观地说,我认为与生成对象数据帧的解决方案相比,我的解决方案有一个优势。是的,coldspeed证实了这一点,部分引用:“并且对象上的所有操作都返回到一个缓慢、循环的实现。”这很好-thnx coldspeed:)。即使不知道OP将执行什么操作,我也怀疑我的解决方案最多也会有相同的性能,并且很可能比使用您的解决方案的操作更糟糕。