根据https://pandas.pydata.org/pandas-docs/stable/internals.html
我应该可以给一个熊猫系列做分镜头
我的MCVE是
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)
s = Xseries([1, 2, 3], attr=3)
请注意,attr
属性是:
s.attr
3
但是,当我乘以2
(s * 2).attr
0
这是默认值。因此,没有传递attr
。你可能会问,也许那不是你想要的行为?我认为这是根据文档https://pandas.pydata.org/pandas-docs/stable/internals.html#define-original-properties
如果我们使用mul
方法,它似乎是有效的
s.mul(2).attr
3
但事实并非如此(与s * 2
相同)
s.__mul__(2).attr
0
在我在github上创建一个问题之前,我想通过这个。这是虫子吗?你知道吗
有解决办法吗?你知道吗
我需要能够执行s * 2
,并将attr
属性传递给结果。你知道吗
如果@chrisb发布了一个类似的答案,我将删除这个答案。你知道吗
正如@chrisbhere发布的,这是一个开放的问题。你知道吗
Matthiasha发布了一个workaround,下面使用我的问题示例重新创建了这个workaround。你知道吗
现在问题解决了:
如果使用
inspect.getsourcelines
检查这两个函数mul
和__mul__
的源代码,您会发现它们实际上有不同的实现。你知道吗而且使用
s.mul(2).attr
仍然不起作用,因为它只是使用__finalize__
来传播所有属性,而不是真正地将属性相乘。你知道吗或者我误解了你的问题,你只是想传播而不是乘
attr
?你知道吗如果是,您可以修改您的自定义
__mul__
函数来调用__finalize__
。你知道吗否则,可以手动将
attr
相乘并返回。你知道吗相关问题 更多 >
编程相关推荐