【问题标题】:Vectorize Pandas Dataframe into Numpy Array将 Pandas 数据帧矢量化为 Numpy 数组
【发布时间】:2017-11-07 10:44:09
【问题描述】:

我有一个问题,我需要将 pandas 数据框转换为列表列表的数组。

示例:

import pandas as pd
df = pd.DataFrame([[1,2,3],[2,2,4],[3,2,4]])

我知道有 as_matrix() 函数返回如下:

df.as_matrix():
# result:array([[1, 2, 3],
                [2, 2, 4],
                [3, 2, 4]])

但是,我需要这种格式的东西

  [array([[1], [2], [3]]),
   array([[2], [2], [4]],
   array([[3], [2], [4]])]

IE。我需要一个包含列表列表的数组列表,其中最里面的列表包含一个元素,数组中最外面的列表代表数据帧的行。这样做的效果是它基本上将dataframe的每一行向量化为一个维度为3的向量。

这很有用,尤其是当我需要在 numpy 中进行矩阵/向量运算并且目前我拥有的数据源是 .csv 格式并且我正在努力寻找将数据帧转换为向量的方法时。

【问题讨论】:

    标签: python pandas numpy matrix dataframe


    【解决方案1】:

    提取底层数组数据,沿最后一个添加新轴,然后使用np.vsplit沿第一个轴拆分-

    np.vsplit(df.values[...,None],df.shape[0])
    

    示例运行 -

    In [327]: df
    Out[327]: 
       0  1  2
    0  1  2  3
    1  2  2  4
    2  3  2  4
    
    In [328]: expected_output = [np.array([[1], [2], [3]]),
         ...: np.array([[2], [2], [4]]),
         ...: np.array([[3], [2], [4]])]
    
    In [329]: expected_output
    Out[329]: 
    [array([[1],
            [2],
            [3]]), array([[2],
            [2],
            [4]]), array([[3],
            [2],
            [4]])]
    
    In [330]: np.vsplit(df.values[...,None],df.shape[0])
    Out[330]: 
    [array([[[1],
             [2],
             [3]]]), array([[[2],
             [2],
             [4]]]), array([[[3],
             [2],
             [4]]])]
    

    如果您使用的是 NumPy funcs,那么在大多数情况下,您应该能够取消拆分并直接使用扩展数组版本。

    现在,under the hoods np.vsplit 使用了np.array_split,这基本上是一个循环。所以,一个更高效的方法是避免函数开销,就像这样 -

    np.array_split(df.values[...,None],df.shape[0])
    

    请注意,这将比预期输出中列出的多一个维度。如果您想要一个挤压版本,我们可以在新轴扩展数组版本上使用列表推导,就像这样 -

    In [357]: [i for i in df.values[...,None]]
    Out[357]: 
    [array([[1],
            [2],
            [3]]), array([[2],
            [2],
            [4]]), array([[3],
            [2],
            [4]])]
    

    因此,另一种方法是在循环中添加新轴 -

    [i[...,None] for i in df.values]
    

    【讨论】:

      【解决方案2】:

      首先将您的 DataFrame 转换为矩阵。然后添加一个维度并将其转换为列表。

      试试:

      df = pd.DataFrame([[1,2,3],[2,2,4],[3,2,4]])
      my_matrix = df.as_matrix()
      my_list_of_arrays_of_list_lists = list(np.expand_dims(my_matrix, axis=2))
      

      my_list_of_arrays_of_list_lists 代表您正在寻找并为您提供:

      Out[42]: [array([[1],[2],[3]]),
                array([[2],[2],[4]]),
                array([[3],[2],[4]])]
      

      【讨论】:

        猜你喜欢
        • 2018-12-31
        • 1970-01-01
        • 2020-06-25
        • 1970-01-01
        • 2019-09-23
        • 1970-01-01
        • 2018-01-09
        • 2019-01-19
        • 2015-02-21
        相关资源
        最近更新 更多