【问题标题】:Convert pandas column of numpy arrays to numpy array of higher dimension将 numpy 数组的 pandas 列转换为更高维的 numpy 数组
【发布时间】:2019-10-30 05:56:24
【问题描述】:

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

这些列中只有一个是 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)

【问题讨论】:

  • 天哪,人们还在编写新的 Python 2 代码吗?
  • 希望不会长久。我相信任何 python 的解决方案都是一样的
  • np.stack(....values) 可以创建具有所需形状的数组。它不会改变数据框自己的存储空间。
  • @hpaulj 就是这样!如果您将其发布为答案,我会接受。我猜这不是最好的性能,但仍然适合我

标签: python arrays pandas numpy


【解决方案1】:

您所要求的不太可能。 Pandas DataFrames 是二维的。是的,您可以在 DataFrame 单元格中将 NumPy 数组存储为 objects(引用),但这并没有得到很好的支持,并且期望得到一个 shape,它有一个来自 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

【讨论】:

【解决方案2】:
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值是一个object 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)

【讨论】:

  • 时隔一年多,我们又见面了。我记得这种方法让我很头疼,想知道这是否是错误的方法。是否有一种标准方法来处理长长的多维数组列表的表格数据? [每个都有自己的标题和相同的形状]
猜你喜欢
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 2023-02-03
  • 2017-03-08
  • 2021-04-04
  • 1970-01-01
相关资源
最近更新 更多