1

我想写一个子类pandas.core.index.Index。我正在遵循 ndarrays 子类化指南,该指南可在numpy 文档中找到。这是我的代码:

import numpy as np
import pandas as pd

class InfoIndex(pd.core.index.Index):

    def __new__(subtype, data, info=None):
        # Create the ndarray instance of our type, given the usual
        # ndarray input arguments.  This will call the standard
        # ndarray constructor, but return an object of our type.
        # It also triggers a call to InfoArray.__array_finalize__
        obj = pd.core.index.Index.__new__(subtype, data)
        # set the new 'info' attribute to the value passed
        obj.info = info
        # Finally, we must return the newly created object:
        return obj

但是,它不起作用;我只得到一个Index对象:

In [2]: I = InfoIndex((3,))

In [3]: I
Out[3]: Int64Index([3])

我究竟做错了什么?

4

3 回答 3

3

当输入是特殊的(例如所有整数或日期时间)时,索引构造函数会尝试变得聪明,并在最后跳到调用查看。所以你需要明确地把它放进去:

In [150]: class InfoIndex(pd.Index):
   .....:     def __new__(cls, data, info=None):
   .....:         obj = pd.Index.__new__(cls, data)
   .....:         obj.info = info
   .....:         obj = obj.view(cls)
   .....:         return obj
   .....:     

In [151]: I = InfoIndex((3,))

In [152]: I
Out[152]: InfoIndex([3])

注意事项:小心子类化 pandas 对象,因为许多方法将显式返回 Index 而不是子类。如果不小心,Index 的子类中也有一些功能会丢失。

于 2012-10-17T17:55:54.570 回答
3

如果您实施该__array_finalize__方法,您可以确保在许多操作中保留元数据。对于某些索引方法,您需要在子类中提供实现。有关更多帮助,请参阅http://docs.scipy.org/doc/numpy/user/basics.subclassing.html

于 2012-10-20T16:17:24.230 回答
0

扩展以前的答案。如果您使用_constructorproperty 和 set ,您还可以保留大多数索引方法_infer_as_myclass = True

于 2018-01-31T18:24:23.187 回答