如何使用python列表对元素进行分组并平均组号?

时间:2017-06-12 15:18:34

标签: python

如何使用python列表对元素进行分组并平均组号? 我有一个列表[1_1 34 1_1 45 1_1 78 2_1 33 2_1 12 3_2 78 3_1 90 1_3 65 1_2 98 1_3 62 1_3 54 1_3 48 1_3 28 1_2 21 1_2 35]第一个元素是组名,第二个元素是数字。 如何将它们放入分组中[1_1 34 1_1 45 1_1 78 1_2 21 1_2 35 1_3 62 ....... 然后通过分组平均,[1_1 52.3 1_2 28 1_3 34 .......]

谢谢

好的,让我澄清一点。我有一个测试结果看起来像这样,我想使用python对它们进行分组并显示每组的平均值。谢谢。

1_1 32 1_1 13 1_1 13 1_1 31 1_3 13 1_1 35 1_2 41 1_1 19 1_2 64 1_3 23 1_2 23 1_2 22 1_2 67 1_2 41 1_3 40 1_1 35 1_2 20 1_2 35 1_3 69 1_2 67 1_3 68 1_1 21 1_3 70 1_3 23 1_3 47 1_3 38 1_3 67 1_3 13 1_2 13 1_2 22 1_3 22 1_3 35 1_3 14 1_3 68 1_2 67 1_3 65 1_3 13 1_3 41 1_3 67 1_3 22 1_3 67 1_2 22 1_2 42 1_2 13 1_3 66 1_3 68 1_3 67 1_2 66 1_3 13 1_3 68 1_2 39

3 个答案:

答案 0 :(得分:0)

以下两种可能的方法可以对所有未来的操作进行排序和存储:

使用元组列表,其中第一项是组名,第二项是元素。这种方法的优点是允许一般排序"所有项目。要从基本列表到这个元组列表,请执行以下操作:

initial_list = ['1_1', 12, '1_2', 23....]
tuple_list = [(initial_list[i], initial_list[i + 1]) for i in xrange(0, len(initial_list), 2)]

OR 带有列表的字典,其中键是组名,值是带有元素的列表。如果你想对一个组的值进行统计(总和,平均值等),这种方法会更灵活:

initial_list = ['1_1', 12, '1_2', 23....]
dict_with_lists = {}
for i in xrange(0, len(initial_list), 2):
    group_name = initial_list[i]
    if group_name in dict_with_lists:
        dict_with_lists[group_name].append(initial_list[i + 1])
    else:
        dict_with_lists[group_name] = [initial_list[i + 1]]

答案 1 :(得分:0)

让我们说

indexes=['1_1','1_1','1_1','2_1','2_1','3_2','3_1','1_3','1_2','1_3','1_3','1_3','1_3','1_2','1_2']
values=[34,45,78,33,12,78,90,65,98,62,54,48,28,21,35]

pandas分组很有趣

import pandas as pd

创建一个包含索引和值的数据框

df=pd.DataFrame(values,columns=["values"],index=indexes)

现在由索引组合并且意味着

df.groupby(df.index).mean()

结果如下:

        values
1_1     52.333333
1_2     51.333333 
1_3     51.400000
2_1     22.500000
3_1     90.000000
3_2     78.000000

答案 2 :(得分:0)

假设我正确理解了这个问题,那么下面的代码应该可以为您提供所需要的内容并且相当pythonic。我已经假设关键词是'是一个字符串(即"1_1"),值是一个整数。

from itertools import groupby
from operator import itemgetter

theList = ["1_1", 34, "1_1", 45, "1_1", 78, "2_1", 33, "2_1", 12, "3_2", 78, "3_1", 90, "1_3", 65, "1_2", 98, "1_3", 62, "1_3", 54, "1_3", 48, "1_3", 28, "1_2", 21, "1_2", 35]

paired = sorted(zip(theList[::2], theList[1::2]), key=itemgetter(0))
grouped = {a: [q[1] for q in b] for a, b in groupby(paired, key=itemgetter(0))}
print {a: sum(b) / float(len(b)) for a, b in grouped.iteritems()}

产地:

{'3_1': 90.0, '3_2': 78.0, '2_1': 22.5, '1_3': 51.4, '1_2': 51.333333333333336, '1_1': 52.333333333333336}

这首先将原始列表压缩为2个元素的元组的新列表(i' th和i + 1'配对在一起),然后按元组对的第1个元素对它们进行排序:

[('1_1', 34), ('1_1', 45), ('1_1', 78), ('1_2', 98), ('1_2', 21), ('1_2', 35), ('1_3', 65), ('1_3', 62), ('1_3', 54), ('1_3', 48), ('1_3', 28), ('2_1', 33), ('2_1', 12), ('3_1', 90), ('3_2', 78)]

然后它通过元组对的第一个元素对它们进行分组,并形成第二个元素的列表,它给出了:

{'3_1': [90], '3_2': [78], '2_1': [33, 12], '1_3': [65, 62, 54, 48, 28], '1_2': [98, 21, 35], '1_1': [34, 45, 78]}

最后,它只显示列表中每个键的项目的平均值,给出最终结果。