计算按第二个列表

时间:2017-05-16 11:22:40

标签: python

我不知道如何在标题中更好地表达自己。基本上我所拥有的是两个列表:

a = ['A','B','A','C','D','C','A',...] 
b = [2,4,8,3,5,2,1,...]

ab的长度相同,b表示与a中的字母相关的值。

现在,我想计算b中每个字母a的平均值。所以最后我会:

a = ['A','B','C','D',...]
b = [3.67, 4, 2.5, 5,...]

在python中是否有这个标准的实现?

3 个答案:

答案 0 :(得分:4)

您可以先执行组。我们可以使用from collections import defaultdict col = defaultdict(list) for ai,bi in zip(a,b): col[ai].append(bi)

来执行此操作
col

现在字典>>> col defaultdict(<class 'list'>, {'C': [3, 2], 'B': [4], 'D': [5], 'A': [2, 8, 1]}) 将如下所示:

>>> {key:sum(vals)/len(vals) for key,vals in col.items()}
{'C': 2.5, 'B': 4.0, 'D': 5.0, 'A': 3.6666666666666665}

现在我们可以计算字典中所有元素的平均值,例如:

zip

您还可以使用a,b = zip(*[(key,sum(vals)/len(vals)) for key,vals in col.items()])

将其转换为两个元组
>>> a,b = zip(*[(key,sum(vals)/len(vals)) for key,vals in col.items()])
>>> a
('C', 'B', 'D', 'A')
>>> b
(2.5, 4.0, 5.0, 3.6666666666666665)

导致:

a,b = map(list,zip(*[(key,sum(vals)/len(vals)) for key,vals in col.items()]))

如果您想要生成列表,可以将它们转换为列表:

>>> a,b = map(list,zip(*[(key,sum(vals)/len(vals)) for key,vals in col.items()]))
>>> a
['C', 'B', 'D', 'A']
>>> b
[2.5, 4.0, 5.0, 3.6666666666666665]

这导致:

Design Pattern

答案 1 :(得分:0)

我相信更简洁的方法就是简单地使用pandas groupby:

import pandas as pd
data = pd.DataFrame(b,index=a)
a,b = (list(data.groupby(data.index)[0].mean().index),list(data.groupby(data.index)[0].mean()))

答案 2 :(得分:0)

您可以按如下方式使用numpy

>>> import numpy as np
>>> array_a = np.array(a)
>>> array_b = np.array(b)
>>> avrg_of_a = np.average(array_b[array_a == 'A'])
>>> avrg_of_a
3.6666666666666665
>>> avrg_of_b = np.average(array_b[array_a == 'B']) 
4.0

您可以生成列表使用列表推导[np.average(array_b[array_a == item]) for item in np.unique(array_a)]