代码之家  ›  专栏  ›  技术社区  ›  eternity1

对“list”列表中的元素求和,每个元素都有不同的索引

  •  2
  • eternity1  · 技术社区  · 7 年前

    从循环中,我有一个变量a:

    aa = pd.Series(np.random.randn(5))
    aaaa = []
    aaaa.append(aa.loc[[1]])
    aaaa.append(aa.loc[[4]])
    aaaa
    
    [1    0.07856
     dtype: float64, 4    0.94552
     dtype: float64]
    

    现在,我想对A中的元素进行求和(或进行任何其他计算)。我尝试了求和函数,但遗憾的是它不起作用。例如,

    B = sum(aaaa)
    

    给了我

    1   NaN
    4   NaN
    dtype: float64
    

    我发现了下面的问题和解决方案,但是,它对我的问题不起作用,因为TO只有一个列表,而没有几个列表附加在一起(使用不同的索引)

    Summing elements in a list

    edit4:由于我必须多次运行此操作,我对两个答案都计时:

    %timeit sum([i.values for i in aaaa])
    3.78 µs ± 5.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    %timeit pd.concat(aaaa).sum()
    560 µs ± 15.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    

    令人惊讶的是,总和中的“循环”比pd快得多。系列concat()。sum()函数

    edit5:如果其他人有同样的问题,则添加:如果不知道输入是否为pd。系列或pd列表。系列,可以执行以下操作:

    res = sum(aa) if isinstance(aa, pd.Series) else sum([i.values for i in aa])
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   ahed87    7 年前

    有很多方法可以摆脱你的先入为主,只有你自己才能知道哪种方法最适合你。

    当你这样做的时候 aa.loc[[1]] 你最终会被警察逮捕。系列,如果你这样做的话 aa.loc[1] 您将获得标量,以及 .iloc

    所以只要把第二对方括号放在 aa。loc[[1]] 将使您的代码正常工作。

    sum 需要一个数字表才能工作。因此,如果您想保留第二对方括号,下面的一行也可以,尽管您现在得到的答案是numpy数组而不是float。

    sum([i.values for i in aaaa])

        2
  •  2
  •   jpp    7 年前

    你误用了 pd.Series.loc ,这将导致列表元素 pd.Series 而不是标量。

    尝试使用 pd.Series.iloc 对于整数索引:

    s = pd.Series(np.random.randn(5))
    
    A = []
    A.append(s.iloc[1])
    A.append(s.iloc[4])
    
    res = sum(A)
    

    注意:您可以通过以下方式直接执行此计算: pd.Series.sum :

    res = s.iloc[[1, 4]].sum()
    

    如果您有 pd。系列 ,您可以使用:

    res = pd.concat(A).sum()