多级索引Pandas面板的切片函数
带有多重索引的Pandas面板的切片函数
我用Panel
结构,并且使用了MultiIndex
(可以查看代码)。如果没有MultiIndex
,我可以用简单的命令将Panel
切片成DataFrame
:
PanelData.major_xs('A')
PanelData.minor_xs('zTwo')
但是,如果我对MultiIndex
的Panel
进行切片,结果仍然是一个Panel
。我该怎么做才能把它变回DataFrame
呢?也就是说,如何将一个三维的Panel
切片成一个二维的DataFrame
?为什么对一个三维Panel
的切片结果也是Panel
呢?如果可以的话,结果应该是从'2010-01-01'到'2010-01-03'的所有区域('zOne'到'zFour')。
import pandas as pd
ListLetter = ['A', 'B', 'C', 'D']
ListCode = [2, 1, 1, 0]
ListZone = ['zOne', 'zTwo', 'zThree', 'zFour']
ListRegion = ['USA', 'CH', 'NZ', 'CH']
index = pd.MultiIndex.from_arrays([ListLetter, ListCode], names=['letter', 'code'])
columns = pd.MultiIndex.from_arrays([ListZone, ListRegion], names=['zone', 'region'])
PanelData = pd.Panel({'2010-01-01': pd.DataFrame(index=index, columns=columns)})
PanelData['2010-01-02'] = pd.DataFrame(index=index, columns=columns)
PanelData['2010-01-03'] = pd.DataFrame(index=index, columns=columns)
PanelData
面板数据:
<class 'pandas.core.panel.Panel'>
Dimensions: 3 (items) x 4 (major_axis) x 4 (minor_axis)
Items axis: 2010-01-01 to 2010-01-03
Major_axis axis: (A, 2) to (D, 0)
Minor_axis axis: (zOne, USA) to (zFour, CH)
注意:我使用的是Python v.2.7.6
和IPython v.1.2.1
。
1 个回答
1
我觉得,当你在Pandas的Panel中对一个多重索引(MultiIndex)进行切片时,因为这个索引是MultiIndex
,所以切片后索引仍然存在(在这个例子中是Items axis: 2 to 2
),因此结果仍然是一个Panel
。
In [67]:
PanelData.swapaxes(0,1).xs('A', 0)
Out[67]:
<class 'pandas.core.panel.Panel'>
Dimensions: 1 (items) x 3 (major_axis) x 4 (minor_axis)
Items axis: 2 to 2
Major_axis axis: 2010-01-01 to 2010-01-03
Minor_axis axis: (zOne, USA) to (zFour, CH)
所以如果我们使用稍微不同的方法来切片MultiIndex
,那么返回的结果就是一个DataFrame
。
In [68]:
print PanelData.swapaxes(0,1).loc[('A',2),]
zone zOne zTwo zThree zFour
region USA CH NZ CH
2010-01-01 NaN NaN NaN NaN
2010-01-02 NaN NaN NaN NaN
2010-01-03 NaN NaN NaN NaN
[3 rows x 4 columns]