2017-06-12 48 views
0

如何使用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列表來分組元素和平均組數?

謝謝

好的,讓我澄清一下這件事。我有一個測試結果看起來像這樣,我想用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

+7

你到目前爲止試過的東西? – pramod

+0

你可以使用字典,他們根據每個鍵找到平均值。 –

+0

我投票結束這個問題作爲題外話,因爲它不是一個代碼編寫服務 –

回答

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] 

分組是與大熊貓的樂趣

import pandas as pd 

創建索引數據框和值

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

現在GROUPBY指數和做意味着

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 
+0

嗯,這非常有幫助。我通過添加df.groupby(df.index).mean()。to_csv(「/ home/jim/test.csv」,sep =',')將它放到csv文件中。它是工作謝謝你! – user8149657

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

與列表,其中的鍵是組名和值的字典與元素列表。如果你想在一組的值做統計(求和,平均值等),這種方式更加靈活:

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

@ PM2Ring小心查明什麼不適合你? (除了在initial_list中留下的明顯的省略號) – lesingerouge

+0

哎呀!我忘了下劃線在數字上是合法的。對於那個很抱歉。 –

+0

@ PM2Ring好吧,你實際上是非常正確的,它是有道理的編輯它這種方式(蟒3.6真的不是很好傳播) – lesingerouge

0

假設我明白這個問題正確然後下面的代碼應該給你你需要什麼,是相當Python的。我假設'key'是一個字符串(即"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個和第i + 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]} 

最後,它只顯示列表中每個項目的最終結果的平均值。