如何使用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
答案 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]}
最后,它只显示列表中每个键的项目的平均值,给出最终结果。