[英]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/transpose
比to_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.