Python 从dict值为numpy数组的字典创建数据帧
我想从一个字典中创建一个数据帧,其中的值是2D 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,
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将执行什么操作,我也怀疑我的解决方案最多也会有相同的性能,并且很可能比使用您的解决方案的操作更糟糕。