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

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 建议的结果。

以上是关于对“列表”列表中的元素求和,每个元素都有不同的索引的主要内容,如果未能解决你的问题,请参考以下文章

给定列表的元素,如何在列表中恢复其索引?

Python 基础2 - 列表

列表和元祖

如何通过对flutter中的元素求和来拆分列表

如何对数组列表的元素求和?

有文化的方式来索引每个元素都有解释的列表?