2015-11-24 2 views
1

Я работаю над методом, чтобы усреднить данные из нескольких файлов и поместить результаты в один файл. Каждая строка файла выглядит следующим образом:Усреднение значений в списке списка списка в Python

Файл № 1

Test1,5,2,1,8 
Test2,10,4,3,2 
... 

File # 2

Test1,2,4,5,1 
Test2,4,6,10,3 
... 

Вот код, я использую для хранения данных:

totalData = [] 
for i in range(0, len(files)): 
    data = [] 
    if ".csv" in files[i]: 
     infile = open(files[i],"r") 
     temp = infile.readline() 

     while temp != "":    
      data.append([c.strip() for c in temp.split(",")]) 
      temp = infile.readline()    

     totalData.append(data) 

Так что я остался с totalData выглядит следующим образом:

totalData = [[ 
      [Test1,5,2,1,8], 
      [Test2,10,4,3,2]], 
      [[Test1,2,4,5,1], 
      [Test2,4,6,10,3]]] 

То, что я хочу усреднить, для всех Test1, Test2 и т. Д., Усредняет все первые значения, а затем и другие значения и т. Д. Так testAverage будет выглядеть так:

testAverage = [[Test1,3.5,3,3,4.5], 
       [Test2,7,5,6.5,2.5]] 

Я изо всех сил думать о краткой/эффективный способ сделать это. Любая помощь очень ценится! Кроме того, если есть лучшие способы управления данным типом данных, пожалуйста, дайте мне знать.

+0

'Test1' является строка в списке ? – Tempux

+0

Да, Test1, Test2 и т. Д. Являются строками в списке. Остальные значения являются целыми числами/удвоениями – brandon

+0

, вы знаете, что вы можете просто сделать 'для строки в дескрипторе файла:' правильно? –

ответ

1

Это просто нужно две петли

totalData = [ [['Test1',5,2,1,8],['Test2',10,4,3,2]], 
        [['Test1',2,4,5,1],['Test2',4,6,10,3]] ] 
for t in range(len(totalData[0])): #tests 
    result = [totalData[0][t][0],] 
    for i in range(1,len(totalData[0][0])): #numbers 
     sum = 0.0 
     for j in range(len(totalData)): 
      sum += totalData[j][t][i] 
     sum /= len(totalData) 
     result.append(sum) 
    print result 
+1

Это дает результат: '['Test1', 3, 3, 3, 4]; ['Test2', 7, 5, 6, 2] ', нет? Кажется, вы опустили механизм преобразования из ints в float. – Boa

+0

Спасибо, что указали это. – Tempux

1

первый расплющить его

results = itertools.chain.from_iterable(totalData) 

затем отсортировать его

results.sort() 

затем использовать GroupBy

data = {} 
for key,values in itertools.groupby(results,lambda x:x[0]): 
    columns = zip(*values) 
    data[key] = [sum(c)*1.0/len(c) for c in columns] 

и, наконец, просто напечатать ваш data

0

Если данные улица ructure является регулярным, лучше всего, вероятно, использовать numpy. Вы должны быть в состоянии установить его с пип из терминала

pip install numpy 

Тогда в Python:

import numpy as np 
totalData = np.array(totalData) 
# remove the last dimension (i.e. 'Test1', 'Test2'), since it's not a number 
totalData = np.array(totalData[:, :, 1:], float) 
# average 
np.mean(totalData, axis=0) 
Смежные вопросы