Python 将“元素”列表中的元素求和;列表“;,每个都有不同的索引

Python 将“元素”列表中的元素求和;列表“;,每个都有不同的索引,python,list,pandas,indexing,calculation,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

从循环中,我有一个变量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)
令人惊讶的是,sum中的“循环”比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
需要一个包含数字的iterable才能工作。因此,如果你想保留第二对方括号,下面的一行也可以,尽管你现在得到的答案是numpy数组而不是float


sum([i.aaaa中i的值])

你好,jpp,对此表示歉意。一定有什么地方不对劲,否则就行了?我删除了“总和”,并包括它的样子。也许从期望的结果来看,这更清楚。事实上,我很想展示一个示例,如何生成“a”,但这是我代码的一部分。在这个特定的示例中,您能给出一些建议吗?我陈述了我作为输入的内容,我想做什么,或者我想得到什么结果,以及当前提出的一种不起作用的方法(见上面的调整)。我的最佳猜测是,乍一看,您有一个混合数据类型列表,其中只有一些由
sum(arg)
支持。不过,我并不完全清楚您的输入或预期输出是什么。仅供将来参考,如果您在使用随机代码路径时遇到间歇性问题,那么组合MCVE的一部分就是选择触发该问题的特定(固定的,即非随机的)示例,并编写一个单独的代码段。然后人们可以帮助你解决手头的实际问题。至于这个问题,我对熊猫不熟悉,所以你必须等待有人看到这一点。看起来您的问题与Pandas
Series
使用的数据类型与内置的
sum
不兼容有关。谢谢,jpp。您有什么想法吗?我如何使用pd.Series而不是将输入设为标量,即a的某种转换方式?是的,解决方案
res=s.iloc[[1,4]].sum()
直接使用
pd.Series
。您不需要单独列出列表和附加项目。或者,建立您的列表
[1,4]
,并将其用作输入。感谢您的及时回复。我确实从我的程序的另一部分获得了一份pd.系列的列表;因此,我无法直接访问“s”;因此,我最后唯一的数字(不需要修改代码的其他部分)是我的“aaaa”pd系列列表谢谢,是的,它也提供了类似于ahed87建议的结果。谢谢,ahed87;正如jpp建议的那样,这条捷径是不使用“loc”;然而,现在我得到的是pd.Series的列表(无需修改代码的其他部分)。