2012-07-24 49 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