使用求和函数

时间:2019-01-11 20:22:45

标签: python pandas python-2.7 add series

我实现了一个Serie类来表示一系列数据及其标签。当我添加Serie对象和数字时,我得到了预期的输出。但是,当我对列表中的相同元素求和时,会收到以下错误消息:

  

TypeError:+不支持的操作数类型:“ int”和“ Serie”

玩具示例代码

作为理解该问题的玩具示例代码,我们可以使用:

import pandas as pd
import numpy as np

class Serie(object):

    def __str__(self):

        s = "> SERIE " + str(self.tag) + ": \n"
        s += str(self.data)
        return s

    def __init__(self, tag=None, data=pd.DataFrame()):
        """
        Creates object Serie

        @type tag: str
        @param tag: Tag for the Serie
        """
        self.tag = tag
        self.data = data

    def __add__(self, other):
        if isinstance(other, int) or isinstance(other, float):
            tag = str(other) + "+" + self.tag
            serie = Serie(tag)
            serie.data = self.data + other
        else:
            try:
                tag = self.tag + "+" + other.tag
            except:
                print ("ERROR: You can't add to somehing that is not a Serie or a number." )
                return None
            serie = Serie(tag)
            serie.data = self.data + other.data
        return serie

s1 = Serie("fibonacci",pd.Series([1,1,2,3,5,8]))
s2 = Serie("2power",pd.Series(np.linspace(1,6,6)**2))
s3 = 10
sumSerie = s1+s2+s3
print sumSerie

这将按预期打印结果:

>>> 
> SERIE 10+fibonacci+2power: 
0    12.0
1    15.0
2    21.0
3    29.0
4    40.0
5    54.0
dtype: float64

使用列表中的对象总数时出错

但是,当我运行以下行时:

l = [s1,s2,s3]
sum(l)

我收到错误消息:

  

sum(l)   TypeError:+不支持的操作数类型:“ int”和“ Serie”

当我运行时会显示相同的错误消息:

l2 = [s1,s2]
sum(l2)

但是在l2列表中没有int变量。

问题

为什么显示此错误消息?因为我能够对列表之外的对象求和,所以这很令人困惑。

我可以做些什么来实现列表中对象的总和吗?

编辑

如评论中所建议,我添加了__radd__以正确重载add方法。因此,我在Serie类中添加了以下几行:

def __radd__(self,other):
    return self.__add__(other)

然后求和。但不像预期的那样。

如果我运行以下代码:

>>> print sum(l)

我得到以下输出:

> SERIE 10+0+fibonacci+2power: 
0    12.0
1    15.0
2    21.0
3    29.0
4    40.0
5    54.0
dtype: float64

这绝对不是我所期望的。标签中还有+0个标记。怎么会这样?但是,如果我使用我在答案print np.array(l).sum()中所述的选项,则结果是正确的。

编辑2

正确重载add方法后,建议使用以下方法按预期方式执行总和:

reduce(lambda a, b: a+b, l)

这种方法可以使列表使用sum函数并获得正确的结果。

pault中所述,sum function's documentationsum方法“开始默认为0”的注释中指出。这就是为什么以前将额外的+0添加到标签中的原因。

总而言之,我相信我更希望使用使用numpy.sum函数的选项:

np.array(l).sum()

1 个答案:

答案 0 :(得分:0)

不确定为什么不能使用sum函数。但是要从列表中获得所需的输出,一种解决方法是从列表中创建一个numpy数组,并使用numpy.sum函数,如下所示:

np.array(l).sum()

这将按预期给出列表中对象的总和。