匹配A列数值相同的行,计算B列数值之和。

3

从大型csv文件中提取的内容如下:

Description,Foo,Excl,GST,Incl
A,foo,$154.52,$15.44,$169.96
A,foo,$45.44,$4.54,$49.98
A,foo,$45.44,$4.54,$49.98
A,foo,$154.52,$15.44,$169.96
A,foo,$0.00,$0.00,$0.00
A,foo,$50.16,$5.02,$55.18
B,foo,$175.33,$15.65,$190.98
C,foo,$204.52,$15.44,$219.96
D,foo,$154.52,$15.44,$169.96
D,foo,$154.52,$15.44,$169.96
D,foo,$45.44,$4.54,$49.98
D,foo,$154.52,$15.44,$169.96
D,foo,$145.44,$14.54,$159.98

我需要去掉所有包含匹配的Description值(AB或其他任何值)的行中的美元符号,并分别为该Description值匹配的Excl列值、GST列值和Incl列值求和。最终结果应该是一个字典对象,其中Description列作为键,匹配DescriptionExclGSTIncl列的总和作为值,例如:
{
    "A": [450.08,44.98,495.06],
    "B": [175.33,15.65,190.98],
    "C": [204.52,15.44,219.96],
    "D": [654.44,65.40,719.84]
}

我完全不知道如何执行求和操作。我的代码只能打开csv文件并读取每行的值。任何启示都将不胜感激。

import csv

def getField(rowdata, index):
    try:
        val = rowdata[index]
    except IndexError:
        val = '-1'
    return val

with open(csv, 'r') as f:
    reader = csv.reader(f)
    order_list = list(reader)

# Remove the header row in csv
order_list.pop(0)

for row in order_list:
    Desc = getField(row, 0)
    Excl = getField(row, 2)
    GST  = getField(row, 3)
    Incl = getField(row, 4)

这些行已经按照第一列排序了吗? - user2390182
你需要将每个总和存储在一个字典中,以Desc作为键。 - mbieren
@schwobaseggl - 是的,数据已经排序。 - Ruan
1个回答

1
这可能会有所帮助。
import csv
import decimal

path = "Path to CSV_File.csv"

def removeSym(s):
    return float(s.replace("$", ""))

with open(path, 'r') as f:
    reader = csv.reader(f)
    order_list = list(reader)

d = {}
for i in order_list[1:]:    #Skip reading the first line
    if i[0] not in d:
        d[i[0]] = map(removeSym, i[2:])   #Check if desc is a key the result dict. if not create 
    else:
        d[i[0]] = [float(round(sum(k),2)) for k in zip(d[i[0]], map(removeSym, i[2:]))]

print d

输出:

{'A': [450.08, 44.98, 495.06], 'C': [204.52, 15.44, 219.96], 'B': [175.33, 15.65, 190.98], 'D': [654.44, 65.4, 719.84]}

非常感谢您。您已经获得了勾选标记。 - Ruan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接