在Python中,为什么我不能简单地继承pandas.Series?

1 投票
1 回答
1069 浏览
提问于 2025-04-17 14:12

我想创建一个新的类,这个类是从pandas.Series继承来的。在Python中,创建一个子类通常没什么问题,但在这个情况下我遇到了一些麻烦。

这里有一个简单的继承示例:

class Test(object):
    def __new__(cls, *args, **kwargs):
        print "new Test"
        return object.__new__(cls, *args, **kwargs)
    def __init__(self):
        print "init Test"

class A(Test):
    def __new__(cls, *args, **kwargs):
        print "new A"
        return Test.__new__(cls, *args, **kwargs)
    def __init__(self):
        print "init A"

print "creating an instance of A"
a = A()
print "type: ", type(a)

这个示例的输出是:

creating an instance of A
new A
new Test
init A
type:  <class '__main__.A'>  

现在我们来试试用Series:

import pandas as pd
class subSeries(pd.Series):
    def __new__(cls, *args, **kwargs):
        print "new subSeries"
        return pd.Series.__new__(cls, *args, **kwargs)

    def __init__(self):
        print "init subSeries"
print "creating an instance of subSeries"
s = subSeries()
print "type: ", type(s)

结果是:

creating an instance of subSeries
new subSeries
type:  <class 'pandas.core.series.Series'>

为什么s是一个Series,而不是一个子Series呢?

相关问题:

1 个回答

1

在pandas的github网站上,有一个关于这个话题的问题被记录下来了:

https://github.com/pydata/pandas/issues/60

我在为一个光谱库数据格式(按波长索引)创建Series的子类时,也遇到了这个问题。过程相当麻烦,需要进行很多“猴子补丁”(也就是临时修改代码)和编写一些方法,这些方法会明确调用Series的方法,但在返回之前会把它换成我的Spectrum类。我需要在newinit中定义一些逻辑。

这个问题似乎与Cython和Python的混合使用,以及numpy的C API有关,还有就是对_constructor()方法的不一致使用。不过,我最近没有关注这个问题。我知道Dataframe和Series的父类从ndarray变成了一个不同的中间类NDFrame,或者说这个过程可能还在进行中。

撰写回答