【问题标题】:Creating DataFrame from a dictionary where values of the dict are numpy array从字典的值是 numpy 数组的字典创建 DataFrame
【发布时间】:2019-04-29 14:05:27
【问题描述】:

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

【问题讨论】:

  • 只是想知道,列中的所有值的长度是否相同? (因为如果是的话,最好将它们保存为 3 列而不是 1 列,并且仍然能够在底层数组上使用所有 numpy 操作)
  • 感谢您的评论。我想稍后将此 DataFrame 与另一个合并,列表示某些结果的不同属性的值。这就是为什么每一列都指向一个属性对我来说很重要的原因。
  • 在这种情况下,让我在这里写一个建议供您使用。

标签: python dictionary


【解决方案1】:
>>> 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)
>>>

【讨论】:

    【解决方案2】:

    也许,为了解决您想要这样做的原因,我建议您制作一个多级数据框。

    给定:

    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 数组,而不是处理对象。 (这有助于提高某些操作的速度,而不是在对数据类型为 object 的列进行操作期间总是诉诸迭代。)

    您仍然可以正常索引:

    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
    

    【讨论】:

    • ...internal structures of the dataframe to be numpy arrays instead of dealing with objects. - 为什么会有好处?
    • 我说错了吗?
    • ??我在问 - 我不使用 MultiIndexed/heirarchical DataFrames/Series,也没有很好的理解。直觉上,我认为我的解决方案比生成对象的 DataFrame 的解决方案有优势。
    • 好吧,coldspeed 证实了这一点here 部分引用:“所有对对象的操作都会退回到一个缓慢、循环的实现。”
    • 这很好 - thnx coldspeed :)。即使不知道 OP 将执行 什么 操作,我怀疑我的解决方案充其量会具有相同的性能,而且很可能会比使用您的解决方案的操作更差。
    猜你喜欢
    • 2020-01-18
    • 2021-03-08
    • 2013-11-28
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    相关资源
    最近更新 更多