将Pandas Dataframe矢量化为Numpy数组

时间:2017-06-06 12:07:59

标签: python pandas numpy matrix dataframe

我有一个问题,我需要将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。我需要一个包含列表列表的数组列表,其中最内层列表包含单个元素,数组中最外面的列表表示数据帧的行。这样做的结果是它基本上将数据帧的每一行矢量化为一个维度为3的向量。

当我需要在numpy中进行矩阵/向量操作时,这非常有用,目前我拥有的数据源是.csv格式,我很难找到将数据帧转换为向量的方法。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

提取基础数组数据,沿最后一个数据添加一个新轴,然后沿着第一个轴分割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函数,那么在大多数情况下,您应该可以取消拆分并直接使用扩展阵列版本。

现在,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]

答案 1 :(得分:0)

首先将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]])]