从一个循环我得到一个变量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只有一个列表,而不是几个列表相互附加(使用不同的索引)
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])
答案 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])