簡體   English   中英

如何將 Pandas MultiIndex DataFrame 轉換為 3D 數組

[英]How to convert a pandas MultiIndex DataFrame into a 3D array

假設我有一個多索引數據幀:

                                c       o       l       u
major       timestamp                       
ONE         2019-01-22 18:12:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:13:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:14:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:15:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:16:00 0.00008 0.00008 0.00008 0.00008

TWO         2019-01-22 18:12:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:13:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:14:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:15:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:16:00 0.00008 0.00008 0.00008 0.00008

我想從這個具有 3 維的 DataFrame 生成一個 NumPy 數組,因為該數據幀在主列中有 15 個類別,4 列和一個長度為 5 的時間索引。我想創建一個形狀為( 4,15,5) 分別表示(列、類別、時間索引)

應該創建一個數組:

array([[[8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05],
        [8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05]],

       [[8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05],
        [8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05]],

       [[8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05],
        [8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05]],

       [[8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05],
        [8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05]]])

過去可以使用 pd.Panel 做到這一點:

panel = pd.Panel(items=[columns], major_axis=[categories], minor_axis=[time_index], dtype=np.float32)
... 

我如何能夠最有效地使用多索引數據框完成此操作? 謝謝

由於df.values(15*100, 4)形數組,您可以調用reshape使其成為(15, 100, 4)形數組:

arr = df.values.reshape(15, 100, 4)

然后調用transpose重新排列軸的順序:

arr = arr.transpose(2, 0, 1)

現在arr形狀為(4, 15, 100)


使用reshape/transposeto_xarray().to_array()快約 960 倍:

In [21]: df = pd.DataFrame(np.random.randint(10, size=(15*100, 4)), index=pd.MultiIndex.from_product([range(15), range(100)], names=['A','B']), columns=list('colu'))

In [22]: %timeit arr = df.values.reshape(15, 100, 4).transpose(2, 0, 1)
3.31 µs ± 23.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [24]: %timeit df.to_xarray().to_array()
3.18 ms ± 24.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [25]: 3180/3.31
Out[25]: 960.7250755287009

使用xarray怎么xarray

res = df.to_xarray().to_array()

結果是一個形狀為 (4, 15, 5) 的數組

事實上,文檔現在推薦將其作為 pandas Panel的替代品。 請注意,您必須安裝xarray包。

如果你的短軸長度不同,你可以試試這個:

df.unstack().ffill().bfill().stack().values.reshape(*df.index.levshape,-1)

仍然看起來很尷尬,為什么 Panel 還是被棄用了?

暫無
暫無

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

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