2014-01-10 41 views
0

這是pandas documentation的一個示例。爲什麼複製panel4d中的項目?

import numpy as np 
from pandas import * 
randn = np.random.randn 

data = { 'Label1' : Panel({ 'Item1' : DataFrame(randn(4, 3)) }), 
     'Label2' : Panel({ 'Item2' : DataFrame(randn(4, 2)) }) } 
p4d = Panel4D(data) 

子面板'Label1'不應該包含一個數據幀'Item2',但是我得到的'Item1'副本:

In [29]: p4d.ix['Label1','Item1',:,:] 
Out[29]: 
      0   1   2 
0 0.283740 0.123377 0.122482 
1 0.756958 0.618638 -1.732440 
2 0.070798 -0.621752 -0.196360 
3 0.462558 -1.023808 0.234144 

In [30]: p4d.ix['Label1','Item2',:,:] 
Out[30]: 
      0   1   2 
0 0.283740 0.123377 0.122482 
1 0.756958 0.618638 -1.732440 
2 0.070798 -0.621752 -0.196360 
3 0.462558 -1.023808 0.234144 

,反之亦然與'Label2''Item1'

爲什麼功能Panel4d的行爲像這樣?

我寧願空的數據框(或至少一個填充NaN)而不是副本。有沒有辦法做到這一點?

回答

0

原來這是一個錯誤。當完全重新索引(例如提供所有軸)面板或更高級別的暗物體時顯示。顯示在0.13和更低的版本。報告在這裏,錯誤修復將在0.13.1。 https://github.com/pydata/pandas/issues/5905

您可以通過創建一個重新索引小組第一

In [15]: items = ['Item1','Item2'] 

In [17]: p1 = Panel({ 'Item1' : DataFrame(randn(4, 3)) }).reindex(items=items) 

In [18]: p2 = Panel({ 'Item2' : DataFrame(randn(4, 2)) }).reindex(items=items) 

In [26]: p4d = pd.Panel4D({ 'Label1' : p1, 'Label2' : p2 }) 

In [27]: p4d.ix['Label1','Item1'] 
Out[27]: 
      0   1   2 
0 1.974462 -0.916765 -0.577381 
1 0.378009 0.047688 -0.281828 
2 -0.288759 0.697560 -0.074013 
3 -0.124308 0.908857 -0.042192 

[4 rows x 3 columns] 

In [28]: p4d.ix['Label1','Item2'] 
Out[28]: 
    0 1 2 
0 NaN NaN NaN 
1 NaN NaN NaN 
2 NaN NaN NaN 
3 NaN NaN NaN 

[4 rows x 3 columns] 
+0

謝謝解決方法。因爲一般來說,我們事先並不知道面板的所有項目,所以我想用'items = Index(set(np.concatenate([panel.items for listOfPanels])))'來獲取它們,然後重新對這些面板進行重新索引。雖然,我不確定這是否是最有效的方法。 – user3183540

相關問題