【问题标题】:Stacking up dataframes in a 3-dimenional numpy array在 3 维 numpy 数组中堆叠数据帧
【发布时间】:2022-01-22 17:49:21
【问题描述】:

我有几个 pandas 数据框,我想使用 numpy 作为三维 numpy 数组将它们堆叠起来。我可以使用以下代码手动完成这项工作:

arr = np.array([df1.values, df2.values], dtype="object")

但是,由于我有很多数据帧,我既不能为所有数据帧编写这一行,也不能自动化它。

我尝试使用 append 函数 (np.append(df1.values, df2['1002'].values)),但它会使数据帧变平并忽略它们的结构。我想要的是一个三维 numpy 数组,其中第一个维度是数据帧的数量(我拥有),第二个维度是每个数据帧中的行数,第三个维度是列数。在我之前提到的第一个示例中,我得到了一个 3D numpy 数组。事实上,当我运行arr.shape 时,结果是(2,),而当我运行arr[0].shapearr[1].shape 时,我分别得到(26, 7)(24, 7),它们分别是它们对应数据帧的结构。

我什至跑了np.append(df1.values, df2['1002'].values, axis=0),但我收到了ValueError: all the input array dimensions for the concatenation axis must match exactly的错误。有什么办法可以解决这个问题并将我的所有数据帧堆叠在一个 3 维 numpy 数组中?

【问题讨论】:

    标签: python-3.x pandas dataframe numpy numpy-ndarray


    【解决方案1】:

    看起来您从 7 列的 2 帧开始,但行数不同。相当于:

    In [1]: arr1 = np.ones((26,7)); arr2 = np.zeros((24,7))
       ...: 
    In [2]: arr = np.array([arr1, arr2], object)
    In [3]: arr.shape
    Out[3]: (2,)
    In [4]: arr[0].shape
    Out[4]: (26, 7)
    

    您可能在没有object 的情况下尝试过此操作并收到“参差不齐的数组”警告。无论如何,这不是 3d 数组。它是 1d (2,),有两个数组。和列表大致相同

    [arr1, arr2]
    

    np.append 文档应明确说明,当您未指定轴时,它会使参数变平。

    In [6]: np.append(arr1,arr2).shape
    Out[6]: (350,)
    

    您可以指定一个轴,并获得一个二维数组,其中 50 是 26 和 24 的总和。

    In [7]: np.append(arr1,arr2,axis=0).shape
    Out[7]: (50, 7)
    

    这与:

    In [8]: np.concatenate((arr1,arr2), axis=0).shape
    Out[8]: (50, 7)
    

    np.appendnp.concatenate 的不良名称封面。它不是列表追加克隆。学习使用concatenate 及其stack 派生词。在

    使用不同的数据框形状,您无法制作 3d 数组。数组不能“参差不齐”。

    至于处理超过 2 个数据帧,如果您可以列出所有帧,则可以使用初始语法。

    alist = []
    for a in frame_list:
        alist.append(a.values)
    arr = np.array(alist, object)
    

    但是制作这样的数组对你没有多大作用。

    如果框架大小都相同,那么你可以制作一个 3d 数组

    In [10]: np.array([arr1[:10,:],arr2[:10,:]]).shape
    Out[10]: (2, 10, 7)
    In [11]: np.stack([arr1[:10,:],arr2[:10,:]]).shape
    Out[11]: (2, 10, 7)
    

    但如果它们不同,stack 会抱怨:

    In [12]: np.stack([arr1, arr2])
    Traceback (most recent call last):
      File "<ipython-input-12-23d05d0422dc>", line 1, in <module>
        np.stack([arr1, arr2])
      File "<__array_function__ internals>", line 180, in stack
      File "/usr/local/lib/python3.8/dist-packages/numpy/core/shape_base.py", line 426, in stack
        raise ValueError('all input arrays must have the same shape')
    ValueError: all input arrays must have the same shape
    

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 2014-05-23
      相关资源
      最近更新 更多