2015-11-22 79 views
1

我想從包含關鍵字的行的第一列計算csv文件中所有值的總和。所有這些數據都將放入Python中的字典中。從csv文件計算一行值的總和Python

我已經拿出這段代碼到目前爲止。唯一的問題是,並非所有的值都是整數,有些是空白的並且包含字符串。我需要更新代碼來忽略這些。

一個明顯的改進是計算文件列的數量,而不是假定它有多達三列的數據,但我不太清楚如何實現這個!

import csv 
d = {} 
with open(filename) as csvfile: 
    rdr = csv.reader(csvfile) 
    if header == True: 
     next(rdr, None) 
    for row in rdr: 
     d[row[0]] = int(row[1]) + int(row[2]) + int(row[3]) 
return d 

我感謝任何幫助!

+0

請給您的數據的樣本... –

回答

3

使用try/except鑄造每個元素float

import csv 
from collections import defaultdict 
with open(filename) as csvfile: 
    next(csvfile) 
    rdr = csv.reader(csvfile) 
    d = defaultdict(float) 
    for row in rdr: 
     for v in row[1:]: 
      try: 
       d[row[0]] += float(v) 
      except ValueError: 
       pass 
    print(d) 

如果該值可以轉換爲浮動鍵的值將遞增,如果不是我們捕捉到的錯誤,繼續前進。

輸入:

a,b,c,d 
1,"foo",3,"" 
2,5,"fuzz",12.12 
3,"","bar",33.3 

輸出:

defaultdict(<class 'float'>, {'1': 3.0, '2': 17.119999999999997, '3': 33.3}) 
2

看看NumPy的 - 它使生活變得更加簡單

from numpy import genfromtxt 
import numpy as np 

my_data = genfromtxt('my_file.csv', delimiter=',', dtype=str) 

d = {} 

for i in my_data: 
    subset = i[1:] # create a subset to from index 1 to end 
    subset[subset == ''] = '0' # change all empty spaces to zero 
    d[i[0]] = np.sum(subset.astype(float)) 
+0

這並不是數值 –

+0

@PadraicCunningham,你是什麼意思將這些值分組? –

+0

OP使用一個dict映射第一行元素作爲任何有效數字值的總和的關鍵字。 –