繁体   English   中英

在“列表”列表中汇总元素,每个元素具有不同的索引

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM