2016-02-12 16 views
3

我在一個CSV文件中讀取像這樣在一個CSV文件中平均爲每列:Python的 - 尋找不包括標題和時間

with open('data.csv', 'rb') as f: 
    reader = csv.reader(f) 
    data_list = list(reader) 

這裏data_list是CSV文件的每一行的列表。所以data_list[0]是csv文件中的第一行(即Headers),data_list[1]以後是包含csv文件中的數據的實際行,而data_line[1:][1]是時間。

所以基本上

data_list= 
[['','Header1','Header2','Header3'], 
['12:02:11', '2.3', '6.2', '11.8'], 
['12:05:25', '1.5', '7.5', '13.2'], 
['12:10:48', '4.1', '6.8', '12.6'], 
['12:13:17', '1.6', '7.1', '12.1']] 

我想找到的每一列,但不包括頭和時間作爲計算的一部分,但保持頭的輸出,僅取一位小數的平均值。總的來說,我想產生這樣的事:

average_data_list= 
[['','Header1','Header2','Header3'], 
['', 2.3', '6.9', '12.4']] 

我一直在使用Python - Calculate average for every column in a csv file爲指導,但我的代碼不斷拋出的錯誤,因爲我不能讓它正確地跳過標題和時間。

任何幫助,將不勝感激

回答

2

下面應該工作:

import csv 

with open('data.csv', 'rb') as f: 
    reader = csv.reader(f) 
    header = next(reader) 
    data_list = list(reader) 
    rows = [''] + ['{:.1f}'.format(sum(float(x) for x in y)/len(data_list)) for y in zip(*data_list)[1:]] 
    average_data_list = [header] + [rows] 

    print average_data_list 

這將顯示:

[['', 'Header1', 'Header2', 'Header3'], ['', '2.4', '6.9', '12.4']] 

這裏的技巧是先讀標題行,以便它不會礙事。 zip(*data_list)用於將行列表轉換爲列列表,以便可以輕鬆計算平均值。

+0

有沒有一種方法可以使平均只有一個小數位長?像正確地在某處加入'%.1f'? – Catherine

+0

確實,只需用適當的'format'替換'str'即可。我已經更新了答案。 –

+0

非常感謝! – Catherine

1

你可以試試:

for i, row in enumerate(data_list): 
    if i == 0: 
     continue 

    for j, value in enumerate(row): 
     average_data_list[j] += value 

quantity = len(data_list) - 1 
for i, sum in enumerate(average_data_list): 
    average_data_list[i] = sum/quantity 

首先你先和所有的值到數組;其次,你重複計算平均值的結果數組。

另一種辦法是在每一步創建的數量和增量的陣列中,要忽略的情況。

0

這個怎麼樣。 a,b和c彙總了各個列的總和。然後除以行數減1(忽略標題行)並僅打印一個小數。

a,b,c = 0,0,0 
for i, row in enumerate(data_list): 
    if i != 0: 
     a += float(row[1]) 
     b += float(row[2]) 
     c += float(row[3]) 

num_vals = len(data_list) - 1 #because of the header 
a /= num_vals 
b /= num_vals 
c /= num_vals 
print "{0:.1f} , {1:.1f}, {2:.1f}".format(a,b,c) 
0

的問題是相當容易使用Python的標準庫提供的csvstatistics模塊來解決。以下示例使用DictReader類從CSV文件加載數據,同時使用列名稱對數據進行旋轉。通過mean函數對列中的數據求平均值,同時通過mapfloat處理數據轉換。

#! /usr/bin/env python3 
import csv 
import statistics 


def main(): 
    with open('data.csv', newline='') as file: 
     reader = csv.DictReader(file) 
     column = {key: [] for key in reader.fieldnames} 
     for row in reader: 
      for key in reader.fieldnames: 
       column[key].append(row[key]) 
    print('Header1 Average =', statistics.mean(map(float, column['Header1']))) 
    print('Header2 Average =', statistics.mean(map(float, column['Header2']))) 
    print('Header3 Average =', statistics.mean(map(float, column['Header3']))) 


if __name__ == '__main__': 
    main()