2015-11-22 56 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映射第一行元素作为任何有效数字值的总和的关键字。 –