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