如何在Python中找到具有两个元素的数组的平均值?

时间:2018-11-10 10:35:30

标签: python numpy

我需要找到一个像[('a', 5), ('b', 2), ('a', 4), ('b', 6)]

这样的数组的均值

结果应该像; [('a', 4.5), ('b', 4)]

5 个答案:

答案 0 :(得分:3)

您可以将所有元组放在defaultdict中,使用第一个值将它们分组为列表,然后计算均值:

collectstatic

答案 1 :(得分:2)

您可以使用collections.defaultdict()收集数字,然后在每组数字上应用statistics.mean()

from statistics import mean
from collections import defaultdict

lst = [('a', 5), ('b', 2), ('a', 4), ('b', 6)]

d = defaultdict(list)
for k, v in lst:
    d[k].append(v)

means = [(k, mean(v)) for k, v in d.items()]

print(means)
# [('a', 4.5), ('b', 4)]

您还可以使用itertools.groupby()对元组进行分组:

from statistics import mean
from itertools import groupby
from operator import itemgetter

lst = [("a", 5), ("b", 2), ("a", 4), ("b", 6)]

means = [
    (k, mean(map(itemgetter(1), g)))
    for k, g in groupby(sorted(lst, key=itemgetter(0)), key=itemgetter(0))
]

print(means)
[('a', 4.5), ('b', 4)]

答案 2 :(得分:2)

我们可以为此使用熊猫:

import pandas as pd

pd.DataFrame(data).groupby(0)[1].mean().to_dict()

这将给我们:

>>> pd.DataFrame(data).groupby(0)[1].mean().to_dict()
{'a': 4.5, 'b': 4.0}

或者我们可以使用以下命令将其转换为2元组列表:

list(pd.DataFrame(data).groupby(0)[1].mean().to_dict().items())

给出:

>>> list(pd.DataFrame(data).groupby(0)[1].mean().to_dict().items())
[('a', 4.5), ('b', 4.0)]

因此,上述方法更像是一种“ 声明式”方法:我们指定所需的 ,而我们所需的方式则不多。

答案 3 :(得分:2)

没有其他库的原始解决方案如下所示:

def mean(l):
    result = {}
    for key, value in l:
        if key not in result:
            result[key] = []
        result[key].append(value)

    return [(k, sum(v)/len(v)) for k, v in result.items()]

lst = [('a', 5), ('b', 2), ('a', 4), ('b', 6)]
m = mean(lst)

print(m)
# [('a', 4.5), ('b', 4.0)]

答案 4 :(得分:2)

如果愿意,还可以尝试以下可重复使用的代码(无需使用任何外部库)。

>>> def get_mean(l):
...     d = {}
...     for k, v in l:
...         if k in d:
...             d[k].append(v)
...         else:
...             d[k] = [v]
...     result = [(k, sum(d[k])/len(d[k])) for k in d]
...     return result
...
>>> l = [('a', 5), ('b', 2), ('a', 4), ('b', 6)]
>>> new_l = get_mean(l)
>>> new_l
[('a', 4.5), ('b', 4.0)]
>>>