对于具有匹配A列值的行,求B列中的值之和

2024-04-25 06:40:01 发布

您现在位置:Python中文网/ 问答频道 /正文

从大型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或任何可能的值)的所有行,分别对Excl列值、GST列值和Incl列值求和。你知道吗

最终结果应该是一个dictionary对象,包含作为键的Description列,以及与Description匹配的ExclGSTIncl列的总和,例如:

{
    "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)

Tags: csvindexfooordervaldescriptionlistreader
1条回答
网友
1楼 · 发布于 2024-04-25 06:40:01

这也许会有帮助

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]}

相关问题 更多 >