对 "list" 列表中的元素求和,每个元素具有不同的索引

Summing elements in a list of "list", each with different index

从循环中我有一个变量 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)

令人惊讶的是,sum 中的 "loop" 比 pd.Series.concat().sum() 函数

快得多

edit5:添加以防其他人遇到同样的问题:如果不知道输入是 pd.Series 还是 pd.Series 的列表,可以执行以下操作:

res = sum(aa) if isinstance(aa, pd.Series) else sum([i.values for i in aa])

您误用了 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.Series的列表,你可以使用:

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

摆脱困境的方法有很多种,只有你自己知道最适合自己的方法。

当您执行 aa.loc[[1]] 时,您最终会得到一个 pd.Series,如果您执行 aa.loc[1],您将得到一个标量,以及 .iloc

因此,只需删除 aa.loc[[1]] 中的第二对方括号,您的代码就可以正常工作。

sum 需要一个带数字的迭代器才能工作。因此,如果您想保留第二对方括号,则下一行也可以使用,尽管您现在将得到一个 numpy 数组而不是浮点数作为答案。

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