对“列表”列表中的元素求和,每个元素都有不同的索引
Posted
技术标签:
【中文标题】对“列表”列表中的元素求和,每个元素都有不同的索引【英文标题】:Summing elements in a list of "list", each with different index 【发布时间】:2018-09-17 16:29:08 【问题描述】:从循环中我有一个变量 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)
令人惊讶的是,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])
【问题讨论】:
嗨 jpp,为此道歉。一定有什么不正确的,否则它会正常工作吗?我删除了“总和”,并包括了它的外观。就期望的结果而言,这可能更清楚。事实上,我很想展示一个示例,说明如何生成“A”,但这是我的部分代码的产物。 你能在这个特定的例子中给出建议吗?我说明了我有什么作为输入,我想做什么或我想得到什么结果,以及当前提出的不起作用的方法(参见上面的调整) 我乍一看最好的猜测是你有一个混合数据类型的列表,其中只有一些是sum(arg)
支持的。不过,我并不完全清楚您的输入或预期输出是什么。
仅供参考,如果您在使用随机代码路径时遇到间歇性问题,则组合 MCVE 的一部分是选择触发问题的特定(固定,即非随机)示例,并且只用它编写一个独立的代码sn-p。然后人们可以帮助您解决手头的实际问题。
关于这个问题,我对 Pandas 不熟悉,所以你必须等待有人看到这个。看起来您的问题与 Pandas Series
使用的数据类型与内置的 sum
不兼容有关。
【参考方案1】:
有很多方法可以摆脱困境,只有你自己知道最适合你的一种。
当您执行aa.loc[[1]]
时,您最终会得到一个pd.Series,如果您执行aa.loc[1]
,您将得到一个标量,以及.iloc
。
因此,只需将第二对方括号放在 aa.loc[[1]]
中即可使您的代码正常工作。
sum
需要一个带有数字的可迭代对象才能工作。因此,如果您想保留第二对方括号,以下行也可以使用,尽管您现在将得到一个 numpy 数组而不是浮点数作为答案。
sum([i.values for i in aaaa])
【讨论】:
谢谢,ahed87;直截了当的方法是 jpp 建议不要使用“loc”;但是,现在我得到的是 pd.Series 列表(无需修改代码的其他部分)。【参考方案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()
【讨论】:
谢谢,jpp。您有什么想法吗,我如何使用 pd.Series 使其工作,而不是使输入成为标量,即 A 的某种转换方式? 是的,解决方案res = s.iloc[[1, 4]].sum()
直接使用pd.Series
。您不需要单独列出和附加项目。或者,构建您的列表 [1, 4]
并将其用作输入。
感谢您的及时回复。我确实从程序的另一部分得到 A 作为 pd.Series 的列表;所以,我不能直接访问's';所以我最后唯一的数字(无需修改代码的其他部分)是我的'aaaa' pd.Series 列表
谢谢你,是的,这也提供了 ahed87 建议的结果。以上是关于对“列表”列表中的元素求和,每个元素都有不同的索引的主要内容,如果未能解决你的问题,请参考以下文章