2012-07-24 69 views
3

我有以下部分輸入文件(擁有超過500行):如何獲得平均爲特定列表元素

L1, a, b, 10, 20, pass, 
L1, c, d, 11, 21, pass, 
L1, e, f, 12, 22, pass, 
L1, a, b, 13, 23, pass, 
L1, e, f, 14, 34, pass, 

我想獲得的平均重複的,也就是輸出如下:

(其中爲L1,A,b,11.5 =(10 + 13)/ 2,21.5 =(20 + 23)/ 2)

L1, a, b, 11.5, 21.5 
L1, c, d, 11, 21 
L1, e, f, 13, 28 

我當前初學者Python代碼是如下 - 仍在努力調整它更好

import csv 
from collections import defaultdict 
import numpy as np 

dd = defaultdict(list) 
with open("mean.csv") as input_file: 
for row in csv.reader(input_file): 
      dd[tuple(row[:3])].append(float(row[3])) 
      dd[tuple(row[:3])].append(float(row[4])) 

for k, v, m in dd.iteritems(): 
     if len(v) > 1: 
      print (' '.join(k), np.mean(v), np.mean(m)) 

我得到的錯誤是:

Traceback (most recent call last): 
    File "average.py", line 11, in <module> 
     for k, v, m in dd.iteritems(): 
    ValueError: need more than 2 values to unpack 
+0

你想使用代碼片段mtrw張貼到我的答案 - 並保持'爲k,v in ...'因爲它... – 2012-07-25 16:00:47

回答

6

未經檢驗的,但像這樣的基地可以適用於其他列...因爲這只是做一個的時刻。

import csv 
from collections import defaultdict 
import numpy as np 

dd = defaultdict(list) 
with open('in.csv') as fin: 
    for row in csv.reader(fin): 
     dd[tuple(row[:3])].append(float(row[3])) 

for k, v in dd.iteritems(): 
    if len(v) > 1: 
     print ' '.join(k), np.mean(v) 
+2

爲了配合這個問題,你不希望你的'print'是'print''。加入(k),np.mean(v)'? – 2012-07-24 23:24:41

+0

@SamMussmann所以它應該 - 好抓住 - 謝謝。 – 2012-07-24 23:28:20

+3

+1 - 如果你想通過執行'dd [tuple(row [:3])]。append([row(3),row(4)])'然後'np你可以讓numpy完成所有的工作。意思是(np.array(v,dtype ='float'),axis = 0)'。不容易閱讀,但可能會更快。 – mtrw 2012-07-25 00:56:12

1

隨着pandas這將是很短的(應該是快)。

你可以做這樣的事情(不知道你列的含義和命名,所以它取決於你想要作爲DataFrame的指數使用什麼):

In [1]: df = pd.read_csv('mean.csv', delimiter=',', header=None) 

In [2]: df 
Out[2]: 
    X.1 X.2 X.3 X.4 X.5 
0 L1 a b 10 20 
1 L1 c d 11 21 
2 L1 e f 12 22 
3 L1 a b 13 23 
4 L1 e f 14 34 

In [3]: df.groupby(['X.1', 'X.2', 'X.3']).mean() 
Out[3]: 
       X.4 X.5 
X.1 X.2 X.3    
L1 a b 11.5 21.5 
    c d 11.0 21.0 
    e f 13.0 28.0 
+0

我對熊貓沒有太多的經驗,但我也會給出這個答案。 – user1504774 2012-07-26 22:13:58

+0

我看了一下你的個人資料,發現你之前問過一個標有'pandas'的問題。雖然只有兩條線可以解決你的問題,但這並不容易,因爲你應該首先學習'numpy',而不是'pandas' api。不過,我認爲這是值得的! – bmu 2012-07-28 06:10:10