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
4

2 に答える 2

6

テストされていませんが、ベースとしてのこのようなものは、他の列に適応させることができます...これは現時点では1つだけです.

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)
于 2012-07-24T23:15:41.857 に答える
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
于 2012-07-25T20:00:59.683 に答える