更改Pandas Panel和Panel4D的唯一轴名称

时间:2015-09-30 08:19:31

标签: python pandas panel

Panel的标准轴名称是Items,Major_axis和Minor_axis

In [2]: pd.Panel()
Out[2]:
<class 'pandas.core.panel.Panel'>
Dimensions: 0 (items) x 0 (major_axis) x 0 (minor_axis)
Items axis: None
Major_axis axis: None
Minor_axis axis: None

这对于地狱而言是无法形容的,并且对于Panel4D来说情况更糟,其中标签被添加为第四轴。有没有办法在初始化期间更改它们?或者我可以使用pd.core.create_nd_panel_factory创建具有不同轴名称的新Panel4D工厂吗?

编辑: 所以我最终想要的是

Out[3]:
<class 'pandas.core.panel.Panel'>
Dimensions: 0 (items) x 0 (major_axis) x 0 (minor_axis)
X axis: None
Y axis: None
Z axis: None

1 个答案:

答案 0 :(得分:1)

由于pandas access axis by user-defined name中给出的答案是针对旧的pandas版本而不提供完整功能,因此它的工作原理如下:

from pandas.core.panelnd import create_nd_panel_factory
from pandas.core.panel import Panel

Panel4D = create_nd_panel_factory(
    klass_name='Panel4D',
    orders=['axis1', 'axis2', 'axis3', 'axis4'],
    slices={'labels': 'labels',
            'axis2': 'items',
            'axis3': 'major_axis',
            'axis4': 'minor_axis'},
    slicer=Panel,
    stat_axis=2,
)


def panel4d_init(self, data=None, axis1=None, axis2=None, axis3=None,
                 axis4=None, copy=False, dtype=None):

    self._init_data(data=data, axis1=axis1, axis2=axis2,
                    axis3=axis3, axis4=axis4,
                    copy=copy, dtype=dtype)

Panel4D.__init__ = panel4d_init

这只是一个part of the Pandas source code ,但略有改动。

然后你得到

>>> Panel4D(np.random.rand(4,4,4,4))
Out[1]: 
<class 'pandas.core.panelnd.Panel4D'>
Dimensions: 4 (axis1) x 4 (axis2) x 4 (axis3) x 4 (axis4)
Axis1 axis: 0 to 3
Axis2 axis: 0 to 3
Axis3 axis: 0 to 3
Axis4 axis: 0 to 3

pandas access axis by user-defined name中给出的答案相反,Panel4D的实例具有完整的功能,其行为就像pandas.Panel4D的实例一样。例如,您现在可以执行Panel4D(np.empty((1,1,1,1)))[0]而不会抛出异常。