Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 某些操作不考虑Series子类中的自定义属性_Python_Pandas - Fatal编程技术网

Python 某些操作不考虑Series子类中的自定义属性

Python 某些操作不考虑Series子类中的自定义属性,python,pandas,Python,Pandas,根据 我应该可以拍一个熊猫系列 我的是 请注意,attr属性是: s.attr 3 但是,当我乘以2 (s * 2).attr 0 这是默认值。因此,attr未被传递。你可能会问,也许这不是你想要的行为?我认为这是根据文件 如果我们使用mul方法,它似乎是有效的 s.mul(2).attr 3 但事实并非如此(这与s*2相同) 在我在github上创建问题之前,我想让它通过。这是虫子吗 有解决办法吗 我需要能够执行s*2并将attr属性传递给结果。如果使用inspect.getso

根据
我应该可以拍一个熊猫系列

我的是

请注意,
attr
属性是:

s.attr

3
但是,当我乘以
2

(s * 2).attr

0
这是默认值。因此,
attr
未被传递。你可能会问,也许这不是你想要的行为?我认为这是根据文件

如果我们使用
mul
方法,它似乎是有效的

s.mul(2).attr

3
但事实并非如此(这与
s*2
相同)


在我在github上创建问题之前,我想让它通过。这是虫子吗

有解决办法吗


我需要能够执行
s*2
并将
attr
属性传递给结果。

如果使用
inspect.getsourcelines
检查这两个函数的源代码
mul
mul\uu
,您会发现它们实际上有不同的实现

使用
s.mul(2).attr仍然不起作用,因为它只使用
\uuuu finalize\uuuu
来传播所有属性,而不是真正地将其相乘

或者也许我误解了你的问题,你只是想传播,而不是繁殖
attr

如果是,您可以修改自定义的
\uuuuu mul\uuuu
函数以调用
\uuuu finalize\uuuu

from pandas import Series


class Xseries(Series):
    _metadata = ['attr']

    @property
    def _constructor(self):
        return Xseries

    def __init__(self, *args, **kwargs):
        self.attr = kwargs.pop('attr', 0)
        super().__init__(*args, **kwargs)

    def __mul__(self, other):
        internal_result = super().__mul__(other)
        return internal_result.__finalize__(self)

s = Xseries([1, 2, 3], attr=3)
如果没有,您可以手动将attr相乘并返回

from pandas import Series


class Xseries(Series):
    _metadata = ['attr']

    @property
    def _constructor(self):
        return Xseries

    def __init__(self, *args, **kwargs):
        self.attr = kwargs.pop('attr', 0)
        super().__init__(*args, **kwargs)

    def __mul__(self, other):
        internal_result = super().__mul__(other)
        if hasattr(other, "attr"):
            internal_result.attr = self.attr * other.attr
        else:
            internal_result.attr = self.attr * other
        return internal_result

s = Xseries([1, 2, 3], attr=3)

如果@chrisb发布了类似的答案,我将删除此答案


正如@chrisb所发布的,这是一个悬而未决的问题

Matthiasha发布了一篇文章,下面用我的问题示例重新创建了一篇文章

from pandas import Series


class Xseries(Series):
    _metadata = ['attr']

    @property
    def _constructor(self):
        def _c(*args, **kwargs):
            # workaround for https://github.com/pandas-dev/pandas/issues/13208
            return Xseries(*args, **kwargs).__finalize__(self)
        return _c

    def __init__(self, *args, **kwargs):
        self.attr = kwargs.pop('attr', 0)
        super().__init__(*args, **kwargs)
现在问题解决了:

(Xseries([1, 2, 3], attr=3) * 2).attr

3

谢谢你的回答。你肯定是对一些与最终确定。为了澄清,我不想将attr相乘。只是让它传播。我试图避免重写方法,但如果必须的话,我会这样做。我把这个问题留待其他人回答。@chrisb谢谢。我周围的工作解决了我的问题problem@chrisb如果你发布了与我发布的类似的答案,我会删除我的。如果你感兴趣的话。先生,回答你的问题真的很难。我试着从早上开始想出一个答案,但是元数据是不可继承的,我不知道为什么。可能当数据被传递到init进行操作时,由于
super
Maybe,序列构造函数会删除attr属性。令人惊讶的是
s*=2
s.attr
有3Yes!关于
\uuuuu mul\uuuuuu
\uuuu add\uuuuu
,或者任何不传播
属性的操作符方法,先生,我认为我们需要使用
\uuu finalize\uuuuuu
将属性从一个对象复制到另一个对象。我试过了,但无法完成,因为我不知道如何将未映射的对象作为
other
参数传递。那么你在github上创建了一个问题?
from pandas import Series


class Xseries(Series):
    _metadata = ['attr']

    @property
    def _constructor(self):
        def _c(*args, **kwargs):
            # workaround for https://github.com/pandas-dev/pandas/issues/13208
            return Xseries(*args, **kwargs).__finalize__(self)
        return _c

    def __init__(self, *args, **kwargs):
        self.attr = kwargs.pop('attr', 0)
        super().__init__(*args, **kwargs)
(Xseries([1, 2, 3], attr=3) * 2).attr

3