【问题标题】:Calculate average of list values grouped by second list计算按第二个列表分组的列表值的平均值
【发布时间】:2017-05-16 11:22:39
【问题描述】:

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

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

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

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

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

在python中有没有标准的实现?

【问题讨论】:

标签: python


【解决方案1】:

您可以先执行 group by。例如,我们可以使用defaultdict

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 = <b>map(list,</b>zip(*[(key,sum(vals)/len(vals)) for key,vals in col.items()])<b>)</b>

这会导致:

>>> 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]

【讨论】:

    【解决方案2】:

    我相信更简洁的方法是简单地使用 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()))
    

    【讨论】:

      【解决方案3】:

      你可以使用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)]

      【讨论】:

      • 这不是一概而论的,也不提供 OP 要求的结果。
      • 为什么不概括?
      • 您已经为 array_a 中的每个值专门定义了变量。
      • 您仍未按照 OP 要求的格式提供答案。
      • 我认为您的回答没有回答 OP 提出的问题——您最终没有按照要求得到 a 和 b 的结果。请参阅我的答案或已按要求回答问题的人的选定答案。
      猜你喜欢
      • 2012-06-03
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多