簡體   English   中英

將 Pandas 數據幀矢量化為 Numpy 數組

[英]Vectorize Pandas Dataframe into Numpy Array

我有一個問題,我需要將 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 格式並且我正在努力尋找一種將數據幀轉換為向量的方法時。

提取底層數組數據,沿最后一個軸添加一個新軸,然后使用np.vsplit沿第一個軸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,那么在大多數情況下,您應該能夠取消拆分並直接使用擴展數組版本。

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

首先將您的 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]])]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM