将numpy数组的pandas列转换为更高维度的numpy数组

时间:2019-06-16 09:54:45

标签: python arrays pandas numpy

我有一个形状为(75,9)的熊猫数据框。

这些列中只有一列是numpy数组,每个数组的形状均为(100, 4, 3)

我有一个奇怪的现象:

data = self.df[self.column_name].values[0]

形状为(100,4,3),但是

data = self.df[self.column_name].values

形状为(75,),其中minmax不是“数字对象”

我希望data = self.df[self.column_name].values的形状(75、100、4、3),其中有一些minmax

如何使一列numpy数组的行为类似于更高维度的numpy数组(长度=数据框中的行数)?


复制:

    some_df = pd.DataFrame(columns=['A'])
    for i in range(10):
        some_df.loc[i] = [np.random.rand(4, 6)]
    print some_df['A'].values.shape
    print some_df['A'].values[0].shape

打印(10L,)(4L,6L)而不是所需的(10L, 4L, 6L)(4L,6L)

2 个答案:

答案 0 :(得分:1)

您要的东西不太可能。熊猫数据框是2D的。是的,您可以将NumPy数组存储为DataFrame单元内的object(引用),但这并没有得到很好的支持,并且期望得到一个shape,它具有DataFrame的一维和来自DataFrame的一维。里面的数组根本不可能。

您应该考虑将数据完全存储在具有适当形状的NumPy数组中,或者存储在具有MultiIndex的单个正确2D DataFrame中。例如,如果将额外维度移至行上MultIndex的新级别,则可以“旋转”一维数组的列成为标量列:

  A
x [2, 3]
y [5, 6]

成为:

    A
x 0 2
  1 3
y 0 5
  1 6

或旋转到列:

  A
  0 1
x 2 3
y 5 6

答案 1 :(得分:1)

In [42]: some_df = pd.DataFrame(columns=['A']) 
    ...: for i in range(4): 
    ...:         some_df.loc[i] = [np.random.randint(0,10,(1,3))] 
    ...:                                                                                  
In [43]: some_df                                                                          
Out[43]: 
             A
0  [[7, 0, 9]]
1  [[3, 6, 8]]
2  [[9, 7, 6]]
3  [[1, 6, 3]]

该列的numpy值是一个对象dtype数组,其中包含数组:

In [44]: some_df['A'].to_numpy()                                                          
Out[44]: 
array([array([[7, 0, 9]]), array([[3, 6, 8]]), array([[9, 7, 6]]),
       array([[1, 6, 3]])], dtype=object)

如果这些数组都具有相同的形状,则stack可以很好地将它们连接到新的维度上:

In [45]: np.stack(some_df['A'].to_numpy())                                                
Out[45]: 
array([[[7, 0, 9]],

       [[3, 6, 8]],

       [[9, 7, 6]],

       [[1, 6, 3]]])
In [46]: _.shape                                                                          
Out[46]: (4, 1, 3)

这仅适用于一列。与所有stack一样,concatenate将输入参数视为可迭代的有效数组列表。

In [48]: some_df['A'].to_list()                                                           
Out[48]: 
[array([[7, 0, 9]]),
 array([[3, 6, 8]]),
 array([[9, 7, 6]]),
 array([[1, 6, 3]])]
In [50]: np.stack(some_df['A'].to_list()).shape                                           
Out[50]: (4, 1, 3)