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

时间:2018-04-08 00:12:31

标签: python list pandas indexing calculation

从一个循环我得到一个变量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中的元素。我尝试使用sum函数,但不幸的是它不起作用。例如,

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.Series.concat()。sum()函数快得多

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

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

2 个答案:

答案 0 :(得分:2)

您滥用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()

答案 1 :(得分:2)

有许多方法可以摆脱你的预测,只有你会知道最适合你的方法。

当你aa.loc[[1]]结束pd.Series时,如果你aa.loc[1],你将得到一个标量,以及.iloc

只需将aa.loc[[1]]中的第二对方括号放下即可使代码正常工作。

sum需要一个带数字的迭代才能工作。因此,如果你想保留第二对方括号,下面一行也会起作用,虽然你现在会得到一个numpy数组而不是float作为答案。

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