Python中基于行输入的条件求和

2024-04-29

我正在尝试用Python 做一个条件和积。简化的思路如下:

A = [1 1 2 3 3 3]
B = [0.50 0.25 0.99 0.80 0.70 0.20]

我想要作为输出

Total1 = 0.50*1 + 0.25*1
Total2 = 0.99*2
Total3 = 0.80*3 + 0.70*3 + 0.20*3

我正在考虑使用 FOR ... IF... 结构来指定给定值A所有对应的值B应该总结一下。

实际上,这是一个巨大的数据集,所以我必须使脚本能够循环所有类别?

目前我正在努力将这个想法转化为合适的 Python 脚本。 有人能指出我正确的方向吗?


这似乎非常适合itertools.groupby https://docs.python.org/library/itertools.html#itertools.groupby(假设值在A are sorted,它可能无法正常工作A=[1,1,2,2,1]):

from itertools import groupby
A = [1, 1, 2, 3, 3, 3]
B = [0.50, 0.25, 0.99, 0.80, 0.70, 0.20]

for key, grp in groupby(zip(A, B), key=lambda x: x[0]):
    grp = [i[1] for i in grp]
    print(key, key * sum(grp))

打印:

1 0.75
2 1.98
3 5.1

您还可以将其存储在列表中而不是打印值:

res = []
for key, grp in groupby(zip(A, B), key=lambda x: x[0]):
    grp = [i[1] for i in grp]
    res.append(key*sum(grp))
print(res)
# [0.75, 1.98, 5.1]

如果您可以选择第 3 方软件包,您也可以使用iteration_utilities.groupedby https://iteration-utilities.readthedocs.io/en/latest/generated/groupedby.html:

>>> from iteration_utilities import groupedby
>>> from operator import itemgetter, add

>>> {key: key*sum(value) for key, value in groupedby(zip(A, B), key=itemgetter(0), keep=itemgetter(1)).items()}
{1: 0.75, 2: 1.98, 3: 5.1}

或使用reduce的参数groupedby直接地:

>>> groupedby(zip(A, B), key=itemgetter(0), keep=lambda x: x[0]*x[1], reduce=add)
{1: 0.75, 2: 1.98, 3: 5.1}

免责声明:我是该书的作者iteration_utilities https://iteration-utilities.readthedocs.io/en/latest/index.html包裹。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python中基于行输入的条件求和 的相关文章

随机推荐