[英]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中的元素进行汇总(或进行任何其他计算)。我尝试使用sum-function,但不幸的是它不起作用。 例如,
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])
您正在滥用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
的列表, pd.Series
可以使用:
res = pd.concat(A).sum()
有很多方法可以摆脱困境,只有您才会知道最适合您的一种。
当您执行aa.loc[[1]]
时,您将得到一个pd.Series,如果您执行aa.loc[1]
您将得到一个标量,以及.iloc
。
因此,只需将第二aa.loc[[1]]
括号放在aa.loc[[1]]
使您的代码正常工作。
sum
需要一个可迭代的数字才能起作用。 因此,如果您想保留第二对方括号,那么下面的行也将起作用,尽管您现在将获得一个numpy数组而不是浮点数作为答案。
sum([i.values for i in aaaa])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.